[英]How to define an array of functions of different signature in F#
我希望能够沿着这条线使用一系列函数:
type SomeFunc =
| StringFunc of (int -> string)
| DecimalFunc of (int -> decimal)
let dataCols = Dict<string, SomeFunc>()
dataCols["A"] <- fun x -> sprintf "%d" x
dataCols["B"] <- fun x -> decimal x
// would want to have:
(dataCols["A"] 0) // "0"
(dataCols["B"] 0) // 0M
如何用有效的F#代码表达这个想法?
第一件事是,将函数放入字典时,需要将它们包装在StringFunc
或DecimalFunc
:
let dataCols = Dictionary<string, SomeFunc>()
dataCols["A"] <- StringFunc(fun x -> sprintf "%d" x)
dataCols["B"] <- DecimalFunc(fun x -> decimal x)
当您要调用该函数时,需要分别处理这两种情况。 这里的一个问题是您的两个函数返回不同的结果。 您实际上不能直接直接执行此操作,因此在调用该函数时,您将必须返回一个装箱的obj
,或者您必须定义一个新的已区分字符串(字符串或十进制)。 第一个选项如下所示:
let call func arg =
match func with
| StringFunc f -> box (f arg)
| DecimalFunc f -> box (f arg)
然后,您可以使用call
助手:
call (dataCols["A"]) 0
call (dataCols["B"]) 0
拳击意味着您将获得obj
,但是很难说出在不了解您的具体情况的情况下处理此问题的最佳方法是什么。
从您的代码中,我得到的印象是,输入类型将始终是相同的(在示例中为int),以便能够在不知道其类型的情况下调用任何列。
如果是这样,则可能要对返回类型而不是函数类型使用DU。 这样,您将获得所需的呼叫行为。
type ColumnValue =
| StringValue of string
| DecimalValue of decimal
let dataCols = Dictionary<string, (int -> ColumnValue)>()
dataCols.["A"] <- fun x -> StringValue (sprintf "%d" x)
dataCols.["B"] <- fun x -> DecimalValue (decimal x)
// what you get
dataCols.["A"] 0 // (StringValue "0")
match (dataCols.["A"] 0) with
| StringValue s -> printf "%s" s
| DecimalValue d -> printf "%M" d
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.