Wenn Sie einen Segmentierungsfehler erhalten, und Sie nicht das FFI oder irgendwelche Funktionen mit unsafe
in ihrem Namen verwendet haben, das ist nicht nicht überraschend, in jeder Situation! Es bedeutet, dass ein Fehler mit GHC vorliegt oder eine Bibliothek, die Sie verwenden, etwas unsicher macht.
Drucken eine unendliche Liste von Double
s mit mapM_ print
ist völlig in Ordnung; Die Liste wird inkrementell verarbeitet und das Programm sollte mit konstanter Speicherbelegung laufen. Ich vermute, dass es einen Fehler im System.Random.Mersenne
Modul gibt, das Sie verwenden, oder einen Fehler in der C-Bibliothek, auf der es basiert, oder ein Problem mit Ihrem Computer (z. B. fehlerhaftem RAM). Hinweis dass newMTGen
mit dieser Warnung kommt:
Aufgrund der aktuellen SFMT Bibliothek erheblich unreine Wesen, die derzeit nur ein einziger Generator pro-Programm erlaubt. Versuche, es neu zu initialisieren, werden fehlschlagen.
Sie könnten besser mit der bereitgestellten global MTGen
statt.
Das heißt, Sie können nicht IO [Double]
in [IO Double]
auf diese Weise konvertieren; Es gibt keine Möglichkeit zu wissen, wie lange die resultierende Liste wäre, ohne die Aktion IO
auszuführen, was unmöglich ist, da Sie ein reines Ergebnis haben (wenn auch eines, das zufällig IO
Aktionen enthält). Für unendliche Listen, könnte man schreiben:
desequence :: IO [a] -> [IO a]
desequence = desequence' 0
where
desequence n m = fmap (!! n) m : desequence (n+1) m
Aber jedes Mal, wenn Sie eine Aktion in dieser Liste ausführen, die IO [a]
Aktion würde wieder ausgeführt werden; es würde nur den Rest der Liste verwerfen.
Der Grund randoms
kann arbeiten und eine unbegrenzte Liste von Zufallszahlen zurückgeben, weil es Lazy IO mit unsafeInterleaveIO
verwendet. (Beachten Sie, dass trotz der „unsicheren“ im Namen, dieser kann nicht Ursache segfaults, so etwas anderes ist zu Fuß.)
Andere, weniger wahrscheinlich Möglichkeiten umfassen eine miscompilation der C-Bibliothek, oder ein Fehler in GHC.
übrigens IO [Double] -> [IO Double] ist im Wesentlichen die umgekehrte Art Signatur 'Sequenz'. – Gautam
Es segregiert hier nicht. –
Klingt wie ein Missverständnis irgendeiner Art oder ein Hardware-Problem, dann ... möchten Sie vielleicht einen [memtest86 +] (http://www.memtest.org/) Check durchführen. – ehird