是否有类似于ruby(&:symbol)中的symbol_to_proc的运算符
#Toto
相当于
(fun x -> x.Toto)
答案 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)