Если вы получили ошибку ошибки сегментации, и вы не использовали FFI или какие-либо функции с unsafe
на свое имя, это не неудивительно, в любой ситуации! Это означает, что есть ошибка с GHC, или библиотека, которую вы используете, делает что-то небезопасное.
Распечатка бесчисленного списка из Double
s с mapM_ print
отлично подходит; список будет обрабатываться постепенно и программа должна работать с постоянной памятью. Я подозреваю, что есть ошибка в модуле System.Random.Mersenne
, который вы используете, или ошибка библиотеки C, на которой он основан, или проблема с вашим компьютером (например, неисправная ОЗУ). Обратите внимание, что newMTGen
приходит с этим предупреждением:
Благодаря текущей SFMT библиотека будучи сильно нечистой, в настоящее время только один генератор допускается за программу. Попытки его повторной инициализации потерпят неудачу.
Возможно, вам лучше использовать предоставленный global MTGen
.
Таким образом, вы не можете преобразовать IO [Double]
в [IO Double]
таким образом; нет никакого способа узнать, как долго результирующий список будет без выполнения действия IO
, что невозможно, поскольку у вас есть чистый результат (хотя один из них содержит IO
действия). Для бесконечных списков, вы могли бы написать:
desequence :: IO [a] -> [IO a]
desequence = desequence' 0
where
desequence n m = fmap (!! n) m : desequence (n+1) m
Но каждый раз, когда вы выполняете действия в этом списке, то IO [a]
действие будет выполнено снова; он просто отменил остальную часть списка.
Причина, по которой randoms
может работать и возвращать бесконечный список случайных чисел, заключается в том, что он использует ленивый IO с unsafeInterleaveIO
. (Обратите внимание, что, несмотря на «небезопасный» в названии, это один не может привести к ошибке сегментации, так что-то еще происходит.)
Другими, менее вероятно, возможности включают в себя неудачные библиотеках C, или ошибка в GHC.
Кстати, IO [Double] -> [IO Double], по существу, обратный тип подписи 'последовательности'. – Gautam
Здесь нет segfault. –
Звучит как неправильная компиляция или проблема с оборудованием, тогда ... вы можете запустить проверку [memtest86 +] (http://www.memtest.org/). – ehird