f#type作为函数输入参数?

时间:2016-03-11 02:22:40

标签: types f#

可以用作函数输入参数吗?

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

2 个答案:

答案 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