2016-08-31 5 views
2

時々iterateを使用しますが、結果のリストに 引数が必要なことはめったにありません。元の要素で始まる `iterate`の理由はありますか?

ドキュメントから:

iterate f x == [x, f x, f (f x), ...] 

私はdrop 1それをすることができますが、私はこの1つのような基本的な機能を設計するための実装から良い理由(多分無料定理)の独立が存在するかどうかを疑問に思います。

+0

あなた自身の提案で 'iterate f x = x:iterate f(f x)'を実行してください。 – Alec

+0

これはHaskellの報告書です:https://www.haskell.org/onlinereport/haskell2010/haskellch20.html#x28-22800020 – Sibi

+6

通常、 'f^0 = id'です。 – chepner

答えて

15

反復関数アプリケーションの話をするとf^m(f^n(x)) == f^(m+n)(x)のようなアイデンティティは、すべての自然数mnため を保持するように、f^0 == idを定義することが便利です。このことを念頭に置いて定義して

、最初の引数を含めることによってiterate満たし、次のアイデンティティを:

iterate f x !! n == f^n x 
1

あなただけiterate f xの出力を持っている場合は、簡単にしたいというものを得ることができます。しかし、[f x, f (f x),...]しかなければ、iterate f xを取得することはできません。詳しく知りたい場合は、オリジナルのxを知っている必要があります。したがって、正面にxをドロップすることは、正当な理由がないのに情報を失うことを意味します。

+0

OPは戻り値の最初の要素を削除するのが安全かどうかを尋ねません。彼はなぜ 'iterate f x'に最初の値として' x'が含まれているのかを尋ねています。 – chepner

+0

それはまさに私が答えるものです。 – MigMit

+0

もちろん、この引数は、すべての関数の入力をその出力に含めることができます。 'map ::(a - > b) - > [a] - >([a]、[b])' – luqui

関連する問題