Я пытаюсь расширить свой разум, изучая 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.