Haskellの機能的な考察(p 213)では、サイクリックリストの2つのバージョンが示されています。一つは、二次の時間に評価されます。サイクリックリストのWHERE句の評価
iterate3 f x = x:map f (iterate3 f x)
iterate3 (2*) 1
= 1:map (2*) (iterate3 (2*) 1)
= 1:2:map (2*) (map (2*) (iterate3 (2*) 1))
= 1:2:4:map (2*) (map (2*) (map (2*) (iterate3 (2*) 1)))
where
を使用する、他の、線形時間で評価されます。
iterate2 f x = xs where xs = x:map f xs
iterate2 (2*) 1
xs where xs = 1:map (2*) xs
= 1:ys where ys = map (2*) (1:ys)
= 1:2:zs where zs = map (2*) (2:zs)
= 1:2:4:ts where ts = map (2*) (4:ts)
私はかなりこの評価を理解していません。 xは(最初のバージョンのように)1ではなく各連続するリスト要素にどのように再割り当てされるのですか?
ありがとう!私にとって、適切な視覚化を見つけることは、多くの場合、再帰を理解する上での最大の障害です。 – planarian
フォローアップ質問:iterate3は循環リストを生成しますか?この点で、テキストはやや曖昧です。 – planarian
@planarian私は、リストそのものにサイクルがないと言っています。どれだけ評価しても、前の要素に戻ってくることはありませんが、定義にはその定義があると主張できます。 (つまり、それは「循環リストの定義」ではなく、「循環リストの定義」ではない)。 – molbdnilo