Этот код прерывается, когда добавляется объявление типа для baz
:
baz (x:y:_) = x == y
baz [_] = baz []
baz [] = False
Общее объяснение (см. Почему я не могу объявить тип вывода? для примера) заключается в том, что он из-за полиморфной рекурсии.
Но это объяснение не объясняет, почему эффект исчезает с другим полиморфно-рекурсивным примером:
foo f (x:y:_) = f x y
foo f [_] = foo f []
foo f [] = False
Он также не объясняет, почему GHC считает, что рекурсия мономорфна без объявления типа.
Может ли объяснение примера с reads
в http://www.haskell.org/onlinereport/decls.html#sect4.5.5 применяться к моему случаю baz
?
т.е. добавление подписи устраняет ограничение мономорфизма, и без ограничения возникает двусмысленность правой части [] с "неотъемлемо неоднозначным" типом forall a . Eq a => [a]
?