【问题标题】:Simple operator to access property in Fsharp在 Fsharp 中访问属性的简单运算符
【发布时间】:2012-03-21 05:30:36
【问题描述】:

在 ruby​​ ( &:symbol ) 中是否有类似于 symbol_to_proc 的运算符,其中

#Toto

等价于

(fun x -> x.Toto)

【问题讨论】:

    标签: ruby f# operators


    【解决方案1】:

    不完全是,但你可以这样做:

    let (!?) p (x:obj) =
        x.GetType().GetProperty(p).GetValue(x)
    
    let four = !?"Length" [5..8]
    

    这使用了反射,因此它的效率不如[5..8].Length,但它可能会给你想要的表现力。

    【讨论】:

    • @Nicolas - 毫无疑问,有时最好避免使用显式 lambda。当然,如果您要使用 let-bound 函数而不是属性,那么您可以这样做(例如 namelist |> List.map length)。
    • 正如基思所说,不,没有语法;会很好的。
    • @Nicolas 只是一个想法——也许您应该尝试按照自己的方式学习 F#,而不是对您认为其他语言缺乏的功能感到失望。
    • @nicolas 只是我注意到你的问题有一个模式——你似乎想将 F# 中的所有内容与你已经知道的东西联系起来。例如,您询问了 R 中“熔化”和“铸造”的等价物。我建议您最好按照自己的方式学习该语言。只是我作为一名开发人员多年来学习了几种不同语言的经验。
    • 我喜欢 F# 中的这样一个功能。 F# 中必要的缺点之一是 lambda 语法,而不必为简单的属性/字段访问做所有那些(有趣的 x -> x.member)的事情会很棒。为什么 'items |> Seq.sumBy (fun item -> item.Prop)' 当 'items |> Seq.sumBy #Prop' 就足够了?
    【解决方案2】:

    kvb 的解决方案是唯一适用于一般情况的解决方案(您希望能够在运行时指定属性名称)。

    但是,如果您在编译时知道属性的名称,并且还希望 要求该属性存在于任何输入中,则可以使用 F# 静态约束,如下所示:

    // Define the 'toto' operator
    let inline toto (a : ^a) =
        (^a : (member Toto: string with get) (a))
    
    type MyType () =
        member __.Toto with get () = "Toto"
    
    // Create an instance of MyType
    let t = MyType()
    
    printf "The song is 'Africa', by %s" (toto t)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 2020-01-31
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      相关资源
      最近更新 更多