Haskell ghci 使用 * 和 max 读取行为

Haskell ghci read behaviour with * and max

所以我刚刚在 ghci 中遇到了以下情况:

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

returns 200 符合预期。然而,这一行

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

抛出异常:

    *** Exception: Prelude.read: no parse

而且我真的无法弄清楚这种 ghci 行为的原因。如有任何帮助,我们将不胜感激!

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

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

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

如果您只是这样写,您也会看到这种行为:

read "10"

但是这样写就可以了:

read "()"

一种解决方案是给出显式类型注释:

max (read "10" :: Int) (read "20" :: Int)

这 returns 20 符合预期。

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

ghci -XNoExtendedDefaultRules

或者使用 GHCi 命令:

:set -XNoExtendedDefaultRules

然后您将收到一条相应的错误消息,内容如下:“Ord a0 没有实例……类型变量 a0 不明确”。