Я читаю LYAH, и в главе 9 я обнаружил любопытную проблему. Автор приводит пример реализации функции "random":
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)))
Этот файл сообщает об ошибке при загрузке:
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)
Тогда все будет хорошо, и, как и ожидалось, будет возвращен список все одинаковые элементы.
Я озадачен: что такого особенного в версии Мирана и моей версии?
Спасибо за любые идеи!