私はhaskell bookを使っていますが、:sprint x
はxの要素を表示するのに使われていると評価されていますが、要素は表示されていません'_'によって)。本の中で提供されている例の方法:スプリントとリストの評価がhaskellで動作する
一つ、
Prelude> let blah = enumFromTo 'a' 'z'
Prelude> :sprint blah
blah = _
Prelude> take 1 blah
"a"
Prelude> :sprint blah
blah = 'a' : _
が異なる入力してテストするために、私はGHCiの中でこれをしなかった: -
prelude> let b = [1,2,3,4,5]
prelude> :sprint b
b = _
prelude> take 1 b
[1]
prelude> :sprint b
b = _
万一最後で:sprint b
のない出力コマンドはb = 1 : _
です。take 1 b
コマンドを使用するときは、単一のリスト項目とcons演算子のみを評価するためです。しかし、それは上の出力を示しています。どのように、なぜこれが起こっていますか?出力はString型の出力と似ていないはずですか?
編集:私はこの結果をより多くの実験をして持ってきた: -
prelude> let b = [1..10] :: [Int]
prelude> :sprint b
b = _
prelude> take 3 b
[1,2,3]
prelude> :sprint b
b = 1 : 2 : 3 : _
さて、私の最初の推測が、あるそれはので、私は二つのリストを構築しています方法のですか? 1つは範囲と明示的にその要素を述べることによって範囲を使用しています(cons ':'コンストラクタをその要素に対して再帰的に使用してリストを作成します)
':set -XMonomorphismRestriction'を実行すると、最初の問題が解消されることになるかもしれません。 ':sprint'の使用例をいくつか示します。 * ParallelとConcurrent Haskell *の本では、ghciの中でデフォルトの '-XNoMonomorphismRestriction'を使う前に、この問題を引き起こします。おそらく ':sprint'を手に入れる前に、常にそれをオフにしたり、署名に慣れさせたりするべきでしょう。 – Michael
先端に感謝します。 –