Generics 如何在没有给定类型声明的情况下测试F#和类型转换中的基元类型 这是我认为强>类型检查< >任何类型的方法,通过模式匹配< /强>,比我所看到的其他所有方法都好。
如果您需要一种简单检查原始类型的方法 我在用F#制作一个Lexer和parser生成器的工作中提出了这一点,无需代码生成、DFA性能和即时类型检查 假设我们有一个syntaks树,您不知道它的外观,甚至不知道它包含哪些类型,但您需要在某个时间点构建它,在此之前可能需要有一个不同类型的集合 这与F#的一般类型系统背道而驰 我使用obj,它可以是任何东西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
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类型错误。这当然会导致程序员检查程序中的类型正确性,但无论如何都需要这样做