は、ランダムな数字をプリントアウトすることになっている次のコードを考えてみましょう。関数 '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. なぜ私の関数の戻り値として入れ子になったIOモナドIO(IO())がありますか?それは単純な定義を持っているなるようにどのように私はこれを書き換えることができ、 <code>deleteAllMp4sExcluding :: [Char] -> IO (IO()) </code>代わりにまた</p> <p><code>deleteAllMp4sExcluding :: [Char] -> IO()</code>の:
- 2. どのように私は国家と作家の両方を利用することができますhaskell?</p> <pre><code>manipList = do goForward goForward goBack </code></pre> <p>と同じで:
- 3. Mac OS XでZeroMQのC++バインディングをインストールするには?</p> <pre><code>g++ actualApp.cpp -lzmq </code></pre> <p>で
- 4. Heredoc <<<または<<?
- 5. MacOsXでvim plantumlを実行するには?</p> <p>LET G:
- 6. 春のアプリケーションコンテキスト - <code>main/src</code>、<code>main/resources</code>、<code>test/src</code>と<code>test/resources</code> - メインとテストフォルダ
- 7. コンパイルC++、私はここで</p> <p><code>c++.11</code>上<code>g++</code>コンパイルに苦しんだタイプ
- 8. Gitは<<<<<<< HEADをファイルに追加し続けます
- 9. なぜ、いつオーバーロードコンストラクタが実行されますか?この文<code>A::A(a)</code>取得者が実行する理由<code>c->g()</code>または</p> <p><code>print(*c);</code>を呼び出すときに
- 10. C++ベクトル<vector <double>> double **
- 11. オブジェクトは、私は自分のアプリケーションで<code>infragistics</code><code>igGrid</code>を使用しているが、私は</p> </blockquote>「_super」プロパティまたはメソッドをサポートしていません<code>javascript</code>エラー</p> <blockquote> <p>オブジェクトを取得しています<p>igGrid
- 12. はどのように、</p> <pre><code>f :: a -> b g :: b -> c h :: c -> d </code></pre> <p>ハスケル
- 13. PHP <<< OUTとOUT;
- 14. 活字入力ファイル<code>.map</code>、私はコマンドラインから<code>tsc</code>を実行すると、私の<code>.js</code>
- 15. WebPACKのビルドが失敗する:私のtest.jsxファイル</p> <p>:</p> <pre><code>import React from 'react'; import { render } from 'react-dom'; render( <button>OK!</button> ); </code></pre> <p>を反応させ、JSXファイル
- 16. perlの<code>s/[^\w:]//g</code>で
- 17. 私は2つの機能</p> <pre><code>void foo() { std::cout << 1 << std::endl; } void bar() { std::cout << 2 << std::endl; } </code></pre> <p>をお持ちの場合は2個の関数のC++
- 18. 変数が</p> <pre><code>var isUpdated:Bool = false </code></pre> <p>がtrueの場合、私はすぐに</p> <pre><code>func performSegue() { self.performSegueWithIdentifier("toTabSegue", sender: self) } </code></pre> <p>を実行したい
- 19. は、私は私の<strong><em>カスタムウィジェットコードから</em></strong>を追加<strong><em>QGridLayout</em></strong>で、QGridLayout
- 20. 「<%:」は何をしますか?</p> <pre><code><%: Model.FirstName %> </code></pre> <p>「<%:」何をん:行う
- 21. Ninjectコンテキストは、私は一般的なインタフェース<code>IRepository<T></code>との2つの実装<code>xrmRepository<T></code>と<code>efRepository<T></code></p> <p>を持っているワット/オープンジェネリック
- 22. MOQ - 辞書<文字列、ダブル>オブジェクト
- 23. Swiftの親/スーパークラスへの参照を取得するには? <code>A</code>からこの例では<code>B</code>継承を</p> <pre><code>class A { } class B:A { } </code></pre> <p>:
- 24. は私が</p> <pre><code>git add . </code></pre> <p>を実行し、今私はgitの追加戻したい
- 25. fstreamのは、<<
- 26. Pythonで `six.moves import urllib`は何をしますか?</p> <pre><code>from six.moves import urllib </code></pre> <p>同時に、私はどこでも<code>urllib.py</code>を見つけることができます:
- 27. は私は</p> <p>グラフィックG = System.Drawing.Graphics.FromHwnd(button1.Handle)からグラフィックスを取得するC#の
- 28. は、私はRDDが</p> <pre><code>JavaPairRDD<String, List<String>> existingRDD; </code></pre> <p>と呼ばれてい
- 29. 使用sudoは私が</p> <pre><code>$ gem install cocoapods </code></pre> <p>を実行すると
- 30. Ubuntuのリダイレクタ "<<<"?
を、IO [ダブル] - > [IOダブル]基本的に '配列' のリバースタイプの署名です。 – Gautam
ここではセグメンテーションがありません。 –
何らかの種類の不具合やハードウェアの問題などのように聞こえる場合は、[memtest86 +](http://www.memtest.org/)のチェックを実行するとよいでしょう。 – ehird