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
不明确”。
所以我刚刚在 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
不明确”。