Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 如何在没有给定类型声明的情况下测试F#和类型转换中的基元类型 这是我认为强>类型检查< >任何类型的方法,通过模式匹配< /强>,比我所看到的其他所有方法都好。_Generics_Casting_F# - Fatal编程技术网

Generics 如何在没有给定类型声明的情况下测试F#和类型转换中的基元类型 这是我认为强>类型检查< >任何类型的方法,通过模式匹配< /强>,比我所看到的其他所有方法都好。

Generics 如何在没有给定类型声明的情况下测试F#和类型转换中的基元类型 这是我认为强>类型检查< >任何类型的方法,通过模式匹配< /强>,比我所看到的其他所有方法都好。,generics,casting,f#,Generics,Casting,F#,如果您需要一种简单检查原始类型的方法 我在用F#制作一个Lexer和parser生成器的工作中提出了这一点,无需代码生成、DFA性能和即时类型检查 假设我们有一个syntaks树,您不知道它的外观,甚至不知道它包含哪些类型,但您需要在某个时间点构建它,在此之前可能需要有一个不同类型的集合 这与F#的一般类型系统背道而驰 我使用obj,它可以是任何东西 type Type = Type of obj 我们定义了一个简单地延迟工作的函数类型 Type delay = Delay of (unit

如果您需要一种简单检查原始类型

的方法 我在用F#制作一个Lexer和parser生成器的工作中提出了这一点,无需代码生成、DFA性能和即时类型检查

假设我们有一个syntaks树,您不知道它的外观,甚至不知道它包含哪些类型,但您需要在某个时间点构建它,在此之前可能需要有一个不同类型的集合

这与F#的一般类型系统背道而驰

我使用obj,它可以是任何东西

type Type = Type of obj
我们定义了一个简单地延迟工作的函数类型

Type delay = Delay of (unit -> Type)

let inline AnyType t = Type (t :> obj)
我们定义了一个延迟工作的函数

let Delay f input = 
    fun _ ->
       f input |> AnyType
    |> Delay
以及调用工作的函数

let Do (Delay f) = f()
现在假设我们有一些词素(符合模式的字符串)和类型

type TYPE = INT of int | FLOAT of float | Error
带函数

let GetValue (Type t) =
    match (Type t) with
    | :? int as t -> INT t
    | :? float as t -> FLOAT t
    | _ -> ERROR
然后我们可以做类似的事情

 let Float (str: string) = System.Double.Parse str
 let Int (str: string) = System.Int32.Parse str



let d = Delay Float "0.123" |> Do |> GetValue
let i = Delay Int "123" |> Do |> GetValue
没有获取compiletime类型错误。这当然会导致程序员检查程序中的类型正确性,但无论如何都需要这样做