Haskell: реализовать «случайные» (также известные как переменная неоднозначного типа)

Я читаю 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)

Тогда все будет хорошо, и, как и ожидалось, будет возвращен список все одинаковые элементы.

Я озадачен: что такого особенного в версии Мирана и моей версии?

Спасибо за любые идеи!

7
задан zw324 26 December 2011 в 20:29
поделиться