在Haskell中测试某些数据是否属于某种类型?

时间:2011-06-16 17:29:25

标签: haskell types type-inference static-typing

因为Haskell有这样的表达类型系统,是否有直接支持的东西我们可以查询某些数据是否属于某种类型?就像在Racket中(String? "Hi")一样(将返回true) 或者像MyType? somedata -> Bool

5 个答案:

答案 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模块进行动态类型,那么您可以这样做。