可以用作函数输入参数吗?
open System
open Microsoft.FSharp.Reflection
type MyTuple = DateTime*int*decimal*decimal
let f tupleType =
let ret = FSharpValue.MakeTuple([|DateTime.Now;1;1.0M;1.0M|],typeof<tupleType>)
let myTuple = ret :?> MyTuple
0
[<EntryPoint>]
let main argv =
f MyTuple
0
在这种情况下,我得到the type tupleType is not defined
。
答案 0 :(得分:3)
因此函数的参数是对象,而不是类型,所以这不起作用。
您在这里尝试做的并不是特别容易。通常,当您使用反射时,您的方法存在缺陷。
你可以做一些论点变成f typeof<whatever>
或类似的东西,但它可能无法解决你原来的问题。
答案 1 :(得分:1)
对于转换,您需要静态(编译时)信息。普通参数是运行时信息。它很容易变得静止 - &gt;运行时但不可能相反。所以:
open System
open Microsoft.FSharp.Reflection
type MyTuple = DateTime*int*decimal*decimal
let f<'a> =
let ret = FSharpValue.MakeTuple([|DateTime(2042, 3, 1, 4, 1, 2); 1; 1.0M; 1.0M|], typeof<'a>)
ret :?> 'a
[<EntryPoint>]
let main _ =
// All these print "(01.03.2042 04:01:02, 1, 1.0M, 1.0M)"
let mt = f<MyTuple>
printfn "%A" mt
let dt, i, d1, d2 = f<MyTuple>
printfn "%A" (dt, i, d1, d2)
let mt : MyTuple = f
printfn "%A" mt
// Except this one (obviously)
try
let mt = f<string>
printfn "%A" mt
with
| :? ArgumentException ->
printfn "Runtime madness"
0