为什么 ghci 在这种情况下不提供预期的 Ambiguous 类型变量错误?
Why doesn't ghci provide the expected Ambiguous type variable error in this scenario?
我正在处理 a Haskell book。它有以下示例:
ghci> Right 3 >>= \x -> return (x + 100)
预计会因以下错误而爆炸:
<interactive>:1:0:
Ambiguous type variable `a' in the constraints:
`Error a' arising from a use of `it' at <interactive>:1:0-33
`Show a' arising from a use of `print' at <interactive>:1:0-33
Probable fix: add a type signature that fixes these type variable(s)
当我运行它时:
$ ghci
Prelude> Right 3 >>= \x -> return (x + 100)
我得到:
Right 103
即我没有得到预期的错误。
现在编译器或库可能已更改 - 但我不确定如何验证。
我的问题是:为什么在这种情况下 ghci 没有提供预期的 Ambiguous 类型变量错误?
这是因为 -XExtendedDefaultRules
现在在 GHCi 中默认启用。要关闭它(并获得您预期的错误消息):
ghci> :set -XNoExtendedDefaultRules
ghci> Right 3 >>= \x -> return (x + 100)
<interactive>:2:1: error:
• Ambiguous type variable ‘a0’ arising from a use of ‘print’
prevents the constraint ‘(Show a0)’ from being solved.
Probable fix: use a type annotation to specify what ‘a0’ should be.
These potential instances exist:
instance (Show b, Show a) => Show (Either a b)
-- Defined in ‘Data.Either’
instance Show Ordering -- Defined in ‘GHC.Show’
instance Show Integer -- Defined in ‘GHC.Show’
...plus 23 others
...plus 11 instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In a stmt of an interactive GHCi command: print it
这个扩展添加了一堆额外的方法来默认其他不明确的代码。在您的例子中,您有一个 Num b => Either a b
类型的表达式。 Regular Haskell defaulting rules 告诉我们 b
应该默认为 Integer
。扩展规则(参见上面的 link)另外默认 a
为 ()
。
我正在处理 a Haskell book。它有以下示例:
ghci> Right 3 >>= \x -> return (x + 100)
预计会因以下错误而爆炸:
<interactive>:1:0:
Ambiguous type variable `a' in the constraints:
`Error a' arising from a use of `it' at <interactive>:1:0-33
`Show a' arising from a use of `print' at <interactive>:1:0-33
Probable fix: add a type signature that fixes these type variable(s)
当我运行它时:
$ ghci
Prelude> Right 3 >>= \x -> return (x + 100)
我得到:
Right 103
即我没有得到预期的错误。
现在编译器或库可能已更改 - 但我不确定如何验证。
我的问题是:为什么在这种情况下 ghci 没有提供预期的 Ambiguous 类型变量错误?
这是因为 -XExtendedDefaultRules
现在在 GHCi 中默认启用。要关闭它(并获得您预期的错误消息):
ghci> :set -XNoExtendedDefaultRules
ghci> Right 3 >>= \x -> return (x + 100)
<interactive>:2:1: error:
• Ambiguous type variable ‘a0’ arising from a use of ‘print’
prevents the constraint ‘(Show a0)’ from being solved.
Probable fix: use a type annotation to specify what ‘a0’ should be.
These potential instances exist:
instance (Show b, Show a) => Show (Either a b)
-- Defined in ‘Data.Either’
instance Show Ordering -- Defined in ‘GHC.Show’
instance Show Integer -- Defined in ‘GHC.Show’
...plus 23 others
...plus 11 instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In a stmt of an interactive GHCi command: print it
这个扩展添加了一堆额外的方法来默认其他不明确的代码。在您的例子中,您有一个 Num b => Either a b
类型的表达式。 Regular Haskell defaulting rules 告诉我们 b
应该默认为 Integer
。扩展规则(参见上面的 link)另外默认 a
为 ()
。