Haskell ghci用*和max读取行为

时间:2015-05-03 21:46:06

标签: haskell types typeclass

所以我刚刚在ghci中遇到了以下内容:

    (*) (read "10") (read "20")

按预期返回200。但是,这一行

    (max) (read "10") (read "20")

抛出异常:

    *** Exception: Prelude.read: no parse

我无法弄清楚这种ghci行为的原因。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:8)

这是GHCi违约规则的一个例子。当遇到不明确的类型时,它会选择()(“unit”)作为默认值。所以它试图将10读作类型为()的值,但无法解析。

类型不明确,因为read的返回类型被重载以处理Read的任何实例,并且max的参数类型被重载以处理{的任何实例{1}},因此编译器无法知道您打算使用哪种类型的中间值:

Ord

如果你只是写下这个,你也会看到这种行为:

read :: (Read a) => String -> a
max :: (Ord a) => a -> a -> a

但是写这个会有效:

read "10"

一种解决方案是提供显式类型注释:

read "()"

按预期返回max (read "10" :: Int) (read "20" :: Int)

您还可以使用命令行标志禁用此行为:

20

或使用GHCi命令:

ghci -XNoExtendedDefaultRules

然后,您将收到一条相应的错误消息:“:set -XNoExtendedDefaultRules 没有实例......类型变量Ord a0不明确”。