В F # как я могу создать выражение с типом Func <obj>? - PullRequest
13 голосов
/ 13 июля 2010

Я работаю с API, который требует значения типа Func.(В частности, я пытаюсь вызвать ModelMetadataProviders.Current.GetMetadataForType () .

Как мне построить это значение в F #?

Ответы [ 3 ]

19 голосов
/ 13 июля 2010

При вызове метода, который принимает любой делегат из Func, вам не нужно явно создавать делегат, потому что F # неявно преобразует лямбда-выражения в тип делегата (в вызовах членов).Я думаю, что простой вызов метода с лямбда-функцией должен работать (если это не так, не могли бы вы поделиться сообщением об ошибке?)

Вот простой пример, демонстрирующий это:

type Foo() = 
  member x.Bar(a:System.Func<obj>) = a.Invoke()

let f = Foo()
let rnd = f.Bar(fun () -> new Random() :> obj)

В вашем случае, я полагаю, что-то вроде этого должно работать:

m.GetMetadataForType((fun () -> <expression> :> obj), modelType)

Обратите внимание, что вам нужно явное повышение (expr :> obj), чтобы лямбда-функция возвращала правильный тип (obj).Если вы хотите назначить лямбда-функцию локальному значению, используя let, тогда оно не будет работать, потому что неявное преобразование работает только тогда, когда оно передается в качестве аргумента напрямую.Однако в этом случае код становится немного приятнее.

7 голосов
/ 13 июля 2010

Обычно вы можете передать любое значение () -> obj, и оно будет автоматически преобразовано в Func<obj>. Вам может понадобиться обернуть fun Func<obj>:

> let d : Func<obj> = Func<obj>(fun () -> box "hello");;

val d : Func<obj>
0 голосов
/ 13 июля 2010
let f = new System.Func<obj>(fun() -> printfn "ok"; new obj())
...