9

私は Haskell にまったく慣れていないので、フィボナッチ数列の遅延表現がどのように機能するかについて頭を悩ませようとしています。

これは以前に尋ねられたことは知っていますが、結果の視覚化に関して私が抱えている問題に対処した回答はありません。

コードは、使用する標準的なものですzipWith

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

私は次のことを理解しています:

  1. zipWith文字通り 2 つのリストを一緒に圧縮します
  2. tailリストの最初の要素を除くすべてを取得します
  3. Haskell は、「予定の」計算データを として参照しthunksます。

私の理解では、最初に追加[0,1,<thunk>]して[1,<thunk>]使用zipWith (+)してを与え[1,<thunk>]ます。だから今、あなたは持っています

fibs = 0 : 1 : 1 : zipWith (+) fibs (tail fibs)

私がグーグルで検索した多くの参考文献は、その後、上記の行を次のように「視覚化」しました。

fibs = 0 : 1 : 1 : zipWith (+) [1,1,<thunk>] ([1,<thunk>]).

私の質問はこれです:

fibs 上記の行のコンポーネントが [1,1,<thunk>] ではなくのみに対応しているの はなぜ[0,1,1,<thunk>]ですか?

fibsリスト全体に加え<thunk>て?

4

2 に答える 2