所以我刚刚在ghci中遇到了以下内容:
(*) (read "10") (read "20")
按预期返回200。但是,这一行
(max) (read "10") (read "20")
抛出异常:
*** Exception: Prelude.read: no parse
我无法弄清楚这种ghci行为的原因。任何帮助将不胜感激!
答案 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
不明确”。