Jeśli pojawi się błąd związany z błędem segmentacji i nie użyłeś FFI ani żadnych funkcji o numerze unsafe
w nazwie, to jest to niezbyt zaskakujące, w każdej sytuacji! Oznacza to, że jest błąd z GHC lub biblioteka, z której korzystasz, robi coś niebezpiecznego.
Wydrukowanie nieskończonej listy Double
s z mapM_ print
jest całkowicie w porządku; lista będzie przetwarzana przyrostowo, a program powinien działać przy stałym wykorzystaniu pamięci. Podejrzewam, że jest błąd w module System.Random.Mersenne
, którego używasz, lub błąd, na którym bazuje biblioteka C lub problem z twoim komputerem (np. Wadliwa pamięć RAM). Zauważ, że newMTGen
pochodzi z tego ostrzeżenia:
Ze względu na obecny SFMT biblioteka jest bardzo zanieczyszczony, obecnie tylko jeden generator jest dozwolone per-programu. Próby reinicjowania go zawiodą.
Być może lepszym rozwiązaniem będzie korzystanie z podanego global MTGen
.
Powiedziawszy, nie można w ten sposób przekształcić IO [Double]
w [IO Double]
; nie ma sposobu, aby wiedzieć, jak długo będzie wyświetlana lista wyników bez wykonywania akcji, która jest niemożliwa, ponieważ masz czysty wynik (choć jeden z nich zawiera akcje IO
). Dla nieskończonych list, można napisać:
desequence :: IO [a] -> [IO a]
desequence = desequence' 0
where
desequence n m = fmap (!! n) m : desequence (n+1) m
Ale za każdym razem, gdy wykonanie czynności w tej liście, akcja IO [a]
będzie ponownie wykonywane; po prostu odrzuciłby resztę listy.
Powód, dla którego randoms
może działać i zwracać nieskończoną listę liczb losowych, ponieważ używa on leniwego IO z unsafeInterleaveIO
. (Zauważ, że mimo „niebezpieczne” w nazwie, ten nie może powodować naruszenia ochrony pamięci, więc coś innego się szykuje.)
Inne, mniej prawdopodobne możliwości obejmują miscompilation biblioteki C, lub błąd w GHC.
Nawiasem mówiąc, IO [dwukrotnie] -> [IO dwukrotnie] jest zasadniczo odwrócony podpis 'sekwencji'. – Gautam
Tutaj nie występuje uszkodzenie. –
Wygląda na to, że wystąpił jakiś błąd w sprzęcie lub problem ze sprzętem, a następnie ... możesz chcieć uruchomić test [memtest86 +] (http://www.memtest.org/). – ehird