【问题标题】:How to use Named Arguments in F#如何在 F# 中使用命名参数
【发布时间】:2018-12-21 07:47:10
【问题描述】:

使用命名参数调用 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)

在 Polly 的 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# overload-resolution named-parameters polly


    【解决方案1】:

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

    现在解决问题的最直接方法是使用:

    c.Add(key = ("five" :&gt; 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)
    

    【讨论】:

    • 这是 obj, obj 重载的一个很好的答案。字符串,obj重载怎么样?
    • 好点@BrettRowberry。我已经更新了我的答案。我希望这有帮助。如果没有,请告诉我。
    • 您是否有特殊原因需要使用命名参数?
    • 这是很棒的东西。我们可以像使用 pollyAddAsString/pollyAddAsObj 一样创建辅助函数,也可以像使用 (k,v)/(x,y) 一样创建和解构元组。
    • F# 是我最喜欢的语言。我从不需要在 .NET 中使用命名参数,但我喜欢它们来解决歧义。我首先从 Objective-C/Swift 中了解了“命名参数”。当我得知它们可以选择包含在 .NET 中时,我非常兴奋。在方法的调用点使用命名参数的好处类似于记录对元组的好处。记录和元组具有几乎相同的功能,但标签使代码更容易阅读,特别是当多个参数/参数按顺序区分时,因为它们具有相同的类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多