f# - 是否可以使用匿名记录

标签 f#

我有一个记录异常和任何记录的函数,这是异常的原因:

let logExceptionWithObject(exn: exn) (obj: Object) =
    try
        delimiter()

        FSharpType.GetRecordFields (obj.GetType())
        |> Array.iter (fun f -> 
                        logger.Error(f.Name + " " + f.GetValue(obj).ToString())
                      )  

        logger.Error(exn.Message)
        logger.Verbose("{@Exn}", exn)
    with
        | exn -> Console.WriteLine(exn.Message)

我可以使用我为其创建类型的任何记录调用此函数。但有时我需要使用记录调用此函数,但我没有类型声明:

logExceptionWithObject exn { A = 10; B = 20; C = "some" }

我不想为每个这样的记录声明类型,但编译器给我错误:

The record label 'A' is not defined.

可以使用匿名记录吗?

最佳答案

F# 没有匿名记录。但在你的例子中,你无论如何都不需要它们,因为你只是将它们用作字典,那么为什么不使用真正的字典呢?

但是等等,您甚至不需要字典 - 您需要的只是一个键/值对列表,仅此而已。

let logExceptionWithObject(exn: exn) map =
    try
        delimiter()
        map |> Seq.iter ( fun (k, v) -> sprintf "%s %s" k v |> logger.Error )
        logger.Error(exn.Message)
        logger.Verbose("{@Exn}", exn)
    with
        | exn -> Console.WriteLine(exn.Message)

用法:

logExceptionWithObject exn [ "A","10" ; "B","20" ; "C","some" ]

关于f# - 是否可以使用匿名记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39732386/

相关文章:

list - F#选择对随机整数列表进行排序

f# - F# 中的代码行数和其他指标

f# - 递归爬取各种记录类型列表的层次结构

F# 类型约束和反射

protected 方法的 F# 公共(public)覆盖

F# : file parsing

f# - F# 中 json.net 的反序列化问题

并行使用时随机数生成器会中断

f# - 不确定递归排序功能?

c# - 使用静态类型语言 (F#) 处理异构数据