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