Я пытаюсь расширить свой кругозор, изучая Haskell.
Моя домашняя работа была связана с созданием тактового генератора, который давал бы мне интервалы, распределенные по Пуассону, и конечный результат (после долгой борьбы, я признаю) был следующим:
import System.Random
poissonStream :: ( Ord r, Random r, Floating r, RandomGen g) => r -> r -> r -> g -> [r]
poissonStream rate start limit gen
| next > limit = []
| otherwise = next:(poissonStream rate next limit newGen)
where (rvalue, newGen) = random gen
next = start - log(rvalue) / rate
Но есть две вещи (по крайней мере), которые я не понимаю:
Зачем мне нужно "Ord r
" и "Floating r
"? (Я бы ожидал какое-то автоматическое наследование: «Плавающий» подразумевает «Орд».)
По какому пути достигается подразумеваемое определение типа "rvalue :: Float
"?
В GHCi я получаю то, что ожидал:
*Main System.Random> let (rvalue, newGen) = random (mkStdGen 100)
<interactive>:1:23:
Ambiguous type variable `t' in the constraint:
`Random t' arising from a use of `random' at <interactive>:1:23-43
Probable fix: add a type signature that fixes these type variable(s)
rvalue - свободная пушка, которую я должен связать:
*Main System.Random> let (rvalue, newGen) = random (mkStdGen 100) :: (Float, StdGen)
*Main System.Random> rvalue
0.18520793
Пожалуйста, будьте осторожны с Haskell n00b.