は、ランダムな数字をプリントアウトすることになっている次のコードを考えてみましょう。関数 'randoms'が無限のリストを生成するので、それは驚くべきことではありません。 xsの最初の10個の値だけを出力したいとします。どうすればいい? xsは型IO [Double]を持ち、[IO Double]型の変数が必要だと思います。 2つの間で変換する演算子は何か。Haskellのモナド:実行すると、私はセグメンテーションフォールトエラーを取得</p> <pre><code>import System.Random.Mersenne main = do g <- (newMTGen Nothing) xs <- (randoms g) :: IO [Double] mapM_ print xs </code></pre> <p>:へ[ダブル] IOは、[IOダブル]
答えて
セグメンテーションフォールトエラーが発生し、FFIまたはその名前にunsafe
の機能を使用しなかった場合、ではないはどんな状況でも驚くほどです!これは、GHC、またはあなたが使用しているライブラリが何か安全でないことをしているバグがあることを意味します。
Double
の無限リストをmapM_ print
で印刷すると問題はありません。リストは段階的に処理され、プログラムは一定のメモリ使用量で実行されます。あなたが使用しているSystem.Random.Mersenne
モジュールにバグがあるか、それがベースとしているCライブラリのバグか、コンピュータに問題がある(RAMの欠陥など)疑いがあります。 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
は、unsafeInterleaveIO
の遅延IOを使用しているため、無限の乱数のリストを返すことができます。
その他、可能性が低い可能性、Cライブラリのmiscompilationを含める(名前に「安全でない」にも関わらず、この1 ことはできません原因セグメンテーション違反なので、他の何かが進行中であるが、ことに注意してください) GHCのバグなどがあります。
記録のために、質問者のコンピュータでは何かが間違っている可能性があると思います。提供されたコードは私のためにセグメンテーションされません。 –
+1「IO [Double]」を「[IO Double]」に変換することはできません... IOアクション「 –
」を実行せずに結果リストがどれくらい長くなるかを知る方法はありません最初の10個のリスト要素にアクセスするだけですか? – Gautam
xsの最初の10個の値だけを出力したいとします。どうすればいい?
だけtake
を使用します。
main =
do g <- (newMTGen Nothing)
xs <- (randoms g) :: IO [Double]
mapM_ print $ take 10 xs
あなたは
XSを書いたIO [ダブル]
を入力しているが、実際に、randoms g
はIO [Double]
型を持つが、おかげでdo
表記、xs
のタイプが[Double]
の場合は、take 10
を適用することができます。
あなたはまたliftM
を使用して結合スキップできます
main =
do g <- newMTGen Nothing
ys <- liftM (take 10) $ randoms g :: IO [Double]
mapM_ print ys
- 1. どのように `[e | x < - xs; y < - ys; ...] =連結[[e | y < - ys; ...] | x < - xs> `
- 2. なぜ私の関数の戻り値として入れ子になったIOモナドIO(IO())がありますか?それは単純な定義を持っているなるようにどのように私はこれを書き換えることができ、 <code>deleteAllMp4sExcluding :: [Char] -> IO (IO()) </code>代わりにまた</p> <p><code>deleteAllMp4sExcluding :: [Char] -> IO()</code>の:
- 3. ガード構文のコンマは何をしますか?コンマはここ</p> <pre><code>filepathNormalise :: BS.ByteString -> BS.ByteString filepathNormalise xs | isWindows, Just (a,xs) <- BS.uncons xs, sep a, Just (b,_) <- BS.uncons xs, sep b = '/' `BS.cons` f xs </code></pre> <p>何をするん:私が読んでいるコードベースで
- 4. Iterator <Item = io :: Result <u8>>をパニックにすることなくio :: Result <Vec<u8>に変換できますか?
- 5. CSS:私は、次のものがあり、CSSで</p> <pre><code><main> <section> <article></article> <aside></aside> </section> </main> </code></pre> <p>:フレックスボックスは、Firefox
- 6. NGリピート:私はNGリピートを使用して、このようなテーブルを描きたい</p> <pre><code>{'A': 'L', 'B': 'L', 'C': 'G', 'D': 'L', 'E': 'G', 'F': 'L' } </code></pre> <p>、ここで</p> <pre><code>L G A C B E D F </code></pre> <p>:オブジェクト
- 7. Mac OS XでZeroMQのC++バインディングをインストールするには?</p> <pre><code>g++ actualApp.cpp -lzmq </code></pre> <p>で
- 8. Heredoc <<<または<<?
- 9. パッケージ私が見て</p> <pre><code>package main </code></pre> <p>を開始して実験し</p> <pre><code>func main() </code></pre> <p>を持ってきた「メイン」とFUNC「メイン」
- 10. C++マップ<ダブル、マルチマップ<int型、オブジェクトに挿入* >>
- 11. どのように私は国家と作家の両方を利用することができますhaskell?</p> <pre><code>manipList = do goForward goForward goBack </code></pre> <p>と同じで:
- 12. MacOsXでvim plantumlを実行するには?</p> <p>LET G:
- 13. 春のアプリケーションコンテキスト - <code>main/src</code>、<code>main/resources</code>、<code>test/src</code>と<code>test/resources</code> - メインとテストフォルダ
- 14. </p> <pre><code>rails g scaffold todo title:string commplete:boolean </code></pre> <p>と私は新しいTODOオブジェクト作成したインデックス
- 15. コンパイルC++、私はここで</p> <p><code>c++.11</code>上<code>g++</code>コンパイルに苦しんだタイプ
- 16. ユニットが見つかりましたが </p> <p>ダブル
- 17. Swift <<, ><, <=< and > = <
- 18. ベクトル<ベクトル<double>>
- 19. Gitは<<<<<<< HEADをファイルに追加し続けます
- 20. なぜ、いつオーバーロードコンストラクタが実行されますか?この文<code>A::A(a)</code>取得者が実行する理由<code>c->g()</code>または</p> <p><code>print(*c);</code>を呼び出すときに
- 21. このコードでは、私は</p> <pre><code>import "OAMutableURLRequest.h" import "OAConsumer.h" </code></pre> <p>そして印刷使用してい
- 22. List <Cluster <DoublePoint>>を設定する<DoublePoint>
- 23. 湾曲SVG `<g>`カーブ
- 24. 代替は「<<<」魚
- 25. ドキュメントは<<< OUT
- 26. <<<
- 27. PyQtは - 私はクリックすることができます</p> <pre><code>class Main(QtGui.QMainWindow): </code></pre> <p>を持って
- 28. C++ベクトル<vector <double>> double **
- 29. std :: operator <<とstd :: ostream :: operator <<
- 30. はどのように、</p> <pre><code>f :: a -> b g :: b -> c h :: c -> d </code></pre> <p>ハスケル
を、IO [ダブル] - > [IOダブル]基本的に '配列' のリバースタイプの署名です。 – Gautam
ここではセグメンテーションがありません。 –
何らかの種類の不具合やハードウェアの問題などのように聞こえる場合は、[memtest86 +](http://www.memtest.org/)のチェックを実行するとよいでしょう。 – ehird