Простой оператор для доступа к недвижимости в Fsharp - PullRequest
0 голосов
/ 02 марта 2012

Есть ли оператор, похожий на symbol_to_proc в ruby ​​(&: symbol), где

#Toto

эквивалентно

(fun x -> x.Toto)

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Не совсем, но вы можете сделать что-то вроде:

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

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

Это использует отражение, поэтому оно не так эффективно, как [5..8].Length, но может дать вам выразительность, которую вы ищете.

1 голос
/ 03 марта 2012

Решение kvb - единственное, которое будет работать для общего случая (когда вы хотите иметь возможность указывать имя свойства во время выполнения).

Однако, если вы знаете имя свойства при компиляции-time, и вы также хотите требовать , чтобы свойство присутствовало на любом входе, вы можете использовать статическое ограничение 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)
...