如何为F#记录字段分配数据类型?类型匹配场景优化咨询
解决F#中Variable类型匹配的问题
我明白你遇到的问题啦——你声明的Variable类型里datatype是Object类型,但你赋值的时候直接写了System.Byte,这其实是把Byte类型本身(而不是Byte类型的实例)塞给了datatype,所以才会出现类似<fun:variable@31>的奇怪输出,而且后续的match也没法正确匹配到对应的分支。
问题根源
System.Byte是类型的引用,当你把它赋值给Object类型的字段时,它实际是一个Type对象,而不是Byte类型的实例。你的match语句是在判断datatype是否为某类型的实例,自然就匹配不上了。
正确的写法
你需要给datatype赋值一个Byte类型的实例,比如用byte 0(F#的字面量写法),或者System.Byte.MinValue这类预定义的实例:
type Variable = { name : string; id : int; datatype : obj } // 正确声明变量,赋值Byte类型的实例 let variable = { name = "foo"; id = 0; datatype = byte 0 } // 现在match就能正常工作了 match variable.datatype with | :? System.Byte -> printfn "Byte" | :? System.Double -> printfn "Double" | _ -> printfn "Other type"
额外说明
如果你其实想存储类型信息(而不是实例),那需要把datatype的类型改成Type,然后匹配的时候判断是否等于目标类型:
type Variable = { name : string; id : int; datatype : Type } let variable = { name = "foo"; id = 0; datatype = typeof<System.Byte> } match variable.datatype with | t when t = typeof<System.Byte> -> printfn "Byte type" | t when t = typeof<System.Double> -> printfn "Double type" | _ -> printfn "Other type"
不过看你的match逻辑,应该是想判断实例的类型,所以第一种写法才是你需要的~
内容的提问来源于stack exchange,提问作者Samantha
相关产品推荐
相关产品推荐

