4

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

4

5 回答 5

19
isInt :: Int -> Bool
isInt _ = True

isString :: String -> Bool
isString _ = True

...
于 2011-06-16T17:36:00.580 回答
12

一般来说,强类型意味着你一开始就不会陷入那种情况。你总是知道你得到的类型,或者你对它一无所知,但有一个支持函数的字典(类型类实例)。Data.Typeable不过,当您使用类型系统玩弄脏把戏以获得泛型类型时,GHC 确实有。

于 2011-06-16T17:32:14.217 回答
7

从本质上讲,您的问题在 Haskell 中没有意义。

Haskell 在编译时静态地知道所有事物的类型。所以没有“测试类型”的概念——这将是一个动态测试。事实上,GHC 会擦除所有类型信息,因为在运行时从不需要它。


唯一的例外是数据以序列化格式(例如字符串)表示的情况。然后,您使用解析作为测试值是否具有正确类型的方法。或者,对于高级用户,在运行时可能需要一些类型信息来解析某些高阶通用操作。

于 2011-06-16T17:51:43.347 回答
1

如果您需要动态检查类型,那么您做错了什么。这在大多数具有类型重构器的语言中通常是正确的,所以函数式语言如 Haskell 或 OCaml 或 F#。

你有强大的类型重构器和模式匹配,为什么你需要一个类型?

于 2011-06-16T17:33:28.797 回答
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模块使用动态类型,那么您可以这样做。

于 2011-06-16T23:39:35.580 回答