F # - Создать Expr вручную - PullRequest
       2

F # - Создать Expr вручную

1 голос
/ 27 апреля 2011

Я пытаюсь создать Expr<'a -> string вручную, и после нескольких часов чтения и попыток я сдаюсь ..

Однако я выяснил, как написать версию C #:

let buildExpression<'a> =
    let p = E.Parameter(typeof<'a>)
    E.Lambda<F<'a,string>>(p)

, который будет производить:

Expression<Func<'a, string>>

Итак, мой вопрос, как мне создать Expr<'a -> string> с помощью модуля Expr?

1 Ответ

2 голосов
/ 27 апреля 2011

Образец C # немного подозрительно, если вы вызвали buildExpression<int>, то результатом будет выражение (в синтаксисе C #): Func<int, string>(x => x), который имеет неправильный тип.Я предполагаю, что C # не проверяет типы во время сборки, но если бы вы попытались скомпилировать его, он, вероятно, вылетел бы.Тогда следующий фрагмент должен сделать трюк:

open Microsoft.FSharp.Quotations

type Foo() =
  member x.Prop = "hello"

// Create a new variable 'x'
let arg = Var.Global("x", typeof<Foo>)
// Use Reflection to get information about the 'Prop' member
let propInfo = typeof<Foo>.GetProperty("Prop")
// Create a lambda 'fun x -> x.Prop'
let e = Expr.Lambda(arg, Expr.PropertyGet(Expr.Var(arg), propInfo))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...