Почему в этом сценарии ghci не предоставляет ожидаемую ошибку переменной неоднозначного типа?

Я работаю над книгой по Haskell. Это следующий пример:

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 не выдает ожидаемую ошибку переменной неоднозначного типа?


person hawkeye    schedule 02.01.2018    source источник
comment
LYAH, должно быть, сильно устарел - за пару лет, которые я знал / использовал Haskell, я даже не слышал, чтобы Error использовался в GHCi. Кто-нибудь знает историю, стоящую за этим?   -  person Alec    schedule 02.01.2018


Ответы (1)


Это связано с _1 _ теперь включен по умолчанию в 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. Стандартные правила Haskell по умолчанию говорят нам, что b по умолчанию должен быть Integer. Расширенные правила (см. Ссылку выше) дополнительно по умолчанию a на ().

person Alec    schedule 02.01.2018