因为Haskell有这样的表达类型系统,是否有直接支持的东西我们可以查询某些数据是否属于某种类型?就像在Racket中(String? "Hi")
一样(将返回true
)
或者像MyType? somedata -> Bool
答案 0 :(得分:19)
isInt :: Int -> Bool
isInt _ = True
isString :: String -> Bool
isString _ = True
...
答案 1 :(得分:12)
一般来说,强打字意味着你不会开始涉及这种情况;你总是知道你给出的类型,或你对它一无所知但是有一个支持函数的字典(类型类实例)。 GHC确实有Data.Typeable
,当你用类型系统玩弄脏技巧来获得泛型类型时。
答案 2 :(得分:7)
基本上,你的问题在Haskell中没有意义。
Haskell在编译时静态地知道所有内容的类型。所以没有“测试类型”的概念 - 这将是一个动态测试。事实上,GHC会删除所有类型的信息,因为它在运行时从不需要。
唯一的例外是数据以序列化格式表示的情况,例如字符串。然后使用解析作为测试值是否具有正确类型的方法。或者,对于高级用户,运行时可能需要某些类型信息来解决某些高阶通用操作。
答案 3 :(得分:1)
如果你需要动态检查一个类型,那么你做错了。在大多数使用类型重构器的语言中通常都是这样,因此函数式语言喜欢Haskell或OCaml或F#。
你有强大的类型重构器和模式匹配,你为什么需要一个类型?
答案 4 :(得分:0)
除了其他答案......
如果您愿意,可以使用Data.Dynamic
模块在Haskell中使用动态类型。例如:
> let dyns = [ toDyn (5 :: Int), toDyn "hello", toDyn not ]
然后,您可以使用fromDynamic
轻松编写特定类型的测试:
isString :: Dynamic -> Bool
isString dyn = isJust (fromDynamic dyn :: Maybe String)
您可以将其应用于任何Dynamic
值,以确定其是否包含String
:
> map isString dyns
[False,True,False]
因此,如果您选择使用Data.Dynamic
模块进行动态类型,那么您可以这样做。