У меня два нубских вопроса
1) Почему sum определена через ленивый foldl, а не строгий foldl'?
sum = foldl (+) 0
sum' = foldl1' (+)
2) Я понимаю, почему данный код вылетает со stack overflow даже для строгой sum'.
print =<< (liftM sum' $ mapM (\_ -> randomNorm) [1..1000000])
Вопрос: как это дело переписать красиво, идиоматично и так, чтобы работало, конечно.
ЗЫ Это не принципиально, но randomNorm генерирует случайное нормально распределенное число
randomNorm :: IO Double
randomNorm = do
u <- randomIO
v <- randomIO
return (sqrt ((-2) * log u) * cos (2*pi*v))