gpt4 book ai didi

f# - 如何在 F# 中使用命名参数

转载 作者:行者123 更新时间:2023-12-04 01:32:32 25 4
gpt4 key购买 nike

调用DictionaryAdd()使用命名参数的方法在 F# 中有效。

let d = Dictionary<string, obj>()
d.Add(key = "five", value = 5)

let d2= Dictionary<obj, obj>()
d2.Add(key = "five", value = 5)
d2.Add(key = 5, value = 5)

在波莉的 Context类,有一个类似的 Add()具有 2 个重载的方法:
Add(key: obj, value: obj) : unit
Add(key: string, value: obj) : unit

我可以通过所有这些方式使用它:
let c = Polly.Context()
c.Add("five", 5)
c.Add(5, 5)
c.Add(key = 5, value = 5)

但不是这样,它说它无法在重载之间解析并且需要类型注释。
c.Add(key = "five", value = 5)

为什么会这样,我该如何解决?

最佳答案

编译器无法确定使用哪种方法。这在使用 F# 处理 C# 和 OO 样式时更为常见。我不介意,让我在功能上保持诚实。

现在解决问题的最直接方法是使用:
c.Add(key = ("five" :> obj), value = 5)
通过强制转换,类型是什么就没有歧义了,编译器也很高兴。

或者,您可以创建一个具有显式类型的函数,这也将帮助编译器找出它。如果您经常使用它,我建议您这样做:

let addToPolly (ctx:Polly.Context) (k:obj) (v:obj) =
ctx.Add(k,v)
ignore()

addToPolly c "five" 5

更新:正如@brett 指出的那样,我已经推断出答案但没有明确。以下是编译器满意的一些示例。
let pollyAddAsString (ctx:Polly.Context) (k:string) (v:obj) = ctx.Add(key = k, value = v) |> ignore
let pollyAddAsObj (ctx:Polly.Context) (k:obj) (v:obj) = ctx.Add(key = k, value = v) |> ignore
pollyAddAsObj c "five" 5
pollyAddAsString c "five" 5

let (k:string,v:obj) = ("five", 5 :> obj)
let (x:obj,y:obj) = ("five" :> obj, 5 :> obj)
c.Add(key = k, value = v)
c.Add(key = x, value = y)

关于f# - 如何在 F# 中使用命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51316475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com