integerList = [1] ++ integerList
(head (tail integerList))
私はこのコードを実行しました。結果は1
であり、無限の再帰であることがわかりました。 私はhaskellがこれらの関数をどのように計算するかを理解しようとしています。誰かがプロセスを書き留めることができます。私はそれを視覚化したいと思います。ありがとう!ハスケル関数のプロセス
integerList = [1] ++ integerList
(head (tail integerList))
私はこのコードを実行しました。結果は1
であり、無限の再帰であることがわかりました。 私はhaskellがこれらの関数をどのように計算するかを理解しようとしています。誰かがプロセスを書き留めることができます。私はそれを視覚化したいと思います。ありがとう!ハスケル関数のプロセス
head
は、リストの最初の要素を返します。この場合、リストtail integerList
の最初の要素を返します。 tail
は最初の要素のない元のリストを返します。元のリストはintegerList
で、これは[1] ++ integerList
にバインドされています。 ++
演算子は2つのリストを連結するため、結果のリストは1 : integerList
です。 tail
をこのリストに適用するとintegerList
となるので、tail integerList
は単にintegerList
となります。
先頭へ戻るtail integerList
をintegerList
と置き換えてください(これは評価されているため)head integerList
を取得してください。お知らせ:integerList
は1 : integerList
と評価されます。 head
を適用すると、1
が得られます。
注目すべき重要なポイントは、 '++ 'は' 1:integerList'を返すために 'integerList' *を評価する必要はないということです。 – chepner
d3daveありがとうございます。それは今完璧な意味があります! :)ありがとうございます – DoubleOseven
のは、定義を拡張してみましょう:
__________
/ \
| |
V |
+---+---+---+ |
integerList = | : | o | o | |
+---+-|-+-|-+ |
| \___/
V
+---+
| 1 |
+---+
あなたが書かれていたかのように:
integerList = [1] ++ integerList
integerList = foldr (:) integerList [1] -- inline (++)
integerList = 1 : integerList -- inline foldr
今ではintegerList
はものの無限のストリームを表す、循環的にリンクされたリストであることは明らかです次のC:
tail
integerList
はintegerList
であり、head
は1
である。 take
、dropWhile
、foldr
のような多くの標準的なプレリュード関数を使用して、無限のストリームを操作することができます。たとえば、take 5 integerList
は[1, 1, 1, 1, 1]
を生成します。 repeat
関数:integerList = repeat 1
を使用してintegerList
を定義することもできます。
すばらしい視覚ガイドをありがとう! :) – DoubleOseven
キーワードは[lazy evaluation](https://wiki.haskell.org/Lazy_evaluation)です。 – bereal
これは私の理解から、これは私が起こっていると思います。 head(tail [1,1] ++ integerList)? – DoubleOseven
これは代わりに次のようになります:head(tail [1] ++([1] ++ integerList))? – DoubleOseven