在Fsharp中访问属性的简单运算符

时间:2012-03-02 17:45:43

标签: ruby f# operators

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

#Toto

相当于

(fun x -> x.Toto)

2 个答案:

答案 0 :(得分:2)

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

let (!?) p (x:obj) =
    x.GetType().GetProperty(p).GetValue(x)

let four = !?"Length" [5..8]

这使用反射,所以它不如[5..8].Length那么高效,但它可能会给你你正在寻找的表现力。

答案 1 :(得分:1)

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)