код вида
type Foo = Bar of int
let number: int = result.GetResult Bar
В number положится число которое было в Bar. Прикол в том что компилятор автоматом выдаёт quotation вместо Bar, как будто я написал <@ Bar @>.
Вопрос: Чтобы у меня такое заработало, я должен положить функцию в класс и аргумент пометить ReflectedDefinition?
Просто если написать так
let doMagic ([<ReflectedDefinition>]expr: Expr) = .....
doMagic Bar // Type `int -> Foo` is not compatible with Expr
А если написать так
type Magic () =
static member doMagic ([<ReflectedDefinition>] expr: Expr) = .....
Magic.doMagic Bar // <— компилятор автоматом тут выдаёт expr
Иначе говоря, как достигнуть поведения как в C#, когда C# автоматом создаёт ExpressionTree при вызове функции принимающей ExpressionTree?
Не могу ответить на вопрос. Но вообще в примере используется Expr<'a>, а не Expr. Вполне возможно, что компилятор заточен только под конкретные типы. Которые в примере ещё и определены на уровне ParsedResult, а не конкретного метода. Т.е. ограничены контекстом, на который компилятор может опереться при необходимости.
На самом деле нужно просто положить функцию в класс и тогда будет работать как задумано. Я просто не понимаю, почему не работает на функциях вне класса(модули), как в моём примере
Ок. Я не так прочёл первое сообщение, Щас врубился, но по основному вопросу ничего сказать не могу.
Обсуждают сегодня