Я читаю LYAH, а в главе 9 я нашел любопытную проблему. Автор представляет пример реализации функции «randoms»:Haskell: Реализация «randoms» (a.k.a., Неоднозначная переменная типа)
randoms' :: (RandomGen g, Random a) => g -> [a]
randoms' gen = let (value, newGen) = random gen in value:randoms' newGen
Ну, это компилируется просто отлично. Но если изменить вторую строку:
randoms' gen = (fst (random gen)) : (randoms' (snd (random gen)))
The этом сообщает файл ошибки при загрузке:
IOlesson.hs:4:52:
Ambiguous type variable `a' in the constraint:
`Random a' arising from a use of `random' at IOlesson.hs:4:52-61
Probable fix: add a type signature that fixes these type variable(s)
Failed, modules loaded: none.
Если изменить эту строку:
randoms' gen = (fst (random gen)) : (randoms' gen)
Тогда это будет делать только отлично, и, как и ожидалось, это вернет список всех одинаковых элементов.
Я озадачен: чем отличается версия Мирана и моя версия?
Спасибо за любые идеи!
Спасибо! Это настолько противоречиво, но вполне понятно. –
Добро пожаловать; Ошибки двусмысленности typeclass могут быть сложными на первый взгляд, но вы должны скоро их повесить :) – ehird