open System
open Microsoft.FSharp.Reflection
open Microsoft.FSharp.Quotations
open Microsoft.FSharp.Quotations.Patterns
type Box<'a, 'b> = Box of 'a * 'b
let iToS
(Box
(i
, v
)) = Box
((sprintf "%A" i
), v
)
let convert (f:Quotations.Expr<'a -> 't>) (v:'a) : 't =
let methi e =
let rec methi' e =
match e with
| Call (x, mi, y) -> mi
| Lambda (_, body) -> methi' body
| _
-> failwith
<| sprintf "not a function %A" e
methi' e
let apply f v =
let m = methi f
m.Invoke(null, [|box v|])
apply f v :?> 't
let r10 = (convert <@ iToS @>) (Box (1, 1))
printfn "%A" r10
let r20 = (convert <@ iToS @>) (Box (1.0, 1.0))
printfn "%A" r20
b3BlbiBTeXN0ZW0Kb3BlbiBNaWNyb3NvZnQuRlNoYXJwLlJlZmxlY3Rpb24Kb3BlbiBNaWNyb3NvZnQuRlNoYXJwLlF1b3RhdGlvbnMKb3BlbiBNaWNyb3NvZnQuRlNoYXJwLlF1b3RhdGlvbnMuUGF0dGVybnMKCnR5cGUgQm94PCdhLCAnYj4gPSBCb3ggb2YgJ2EgKiAnYgoKbGV0IGlUb1MgKEJveCAoaSwgdikpID0gQm94ICgoc3ByaW50ZiAiJUEiIGkpLCB2KQoKbGV0IGNvbnZlcnQgKGY6UXVvdGF0aW9ucy5FeHByPCdhIC0+ICd0PikgKHY6J2EpIDogJ3QgPQogICAgbGV0IG1ldGhpIGUgPQogICAgICAgIGxldCByZWMgbWV0aGknIGUgPQogICAgICAgICAgICBtYXRjaCBlIHdpdGgKICAgICAgICAgICAgICAgIHwgQ2FsbCAoeCwgbWksIHkpIC0+IG1pCiAgICAgICAgICAgICAgICB8IExhbWJkYSAoXywgYm9keSkgLT4gbWV0aGknIGJvZHkKICAgICAgICAgICAgICAgIHwgXyAtPiBmYWlsd2l0aCA8fCBzcHJpbnRmICJub3QgYSBmdW5jdGlvbiAlQSIgZQogICAgICAgIG1ldGhpJyBlCgogICAgbGV0IGFwcGx5IGYgdiA9CiAgICAgICAgbGV0IG0gPSBtZXRoaSBmCiAgICAgICAgbS5JbnZva2UobnVsbCwgW3xib3ggdnxdKQoKICAgIGFwcGx5IGYgdiA6Pz4gJ3QKCmxldCByMTAgPSAoY29udmVydCA8QCBpVG9TIEA+KSAoQm94ICgxLCAxKSkKcHJpbnRmbiAiJUEiIHIxMAoKbGV0IHIyMCA9IChjb252ZXJ0IDxAIGlUb1MgQD4pIChCb3ggKDEuMCwgMS4wKSkKcHJpbnRmbiAiJUEiIHIyMA==