12
iterate :: (a -> a) -> a -> [a]

(おそらくご存じのとおり)iterateは、関数と開始値を取る関数です。次に、関数を開始値に適用し、同じ関数を最後の結果に適用する、というように続きます。

Prelude> take 5 $ iterate (^2) 2
[2,4,16,256,65536]
Prelude> 

結果は無限リストです。(それが私が使用する理由ですtake)。私の質問ですが、基本 (ラムダ、パターン マッチング、ガードなど)iterate'のみを使用して、Haskell で独自の関数をどのように実装しますか?(:) (++)

(Haskell初心者はこちら)

4

2 に答える 2

28

さて、反復は、 fで増分された値無限のリストを構築します。したがって、 faを使用して反復を再帰的に呼び出すことによって構築されたリストに値aを付加する関数を作成することから始めます。

iterate :: (a -> a) -> a -> [a]
iterate f a = a : iterate f (f a)

遅延評価のおかげで、関数の値を計算するために必要な構築リストのその部分だけが評価されます。

于 2010-09-22T13:42:17.800 に答える
15

また、レポートの標準プレリュードで、基本的なHaskell関数の範囲の簡潔な定義を見つけることができることに注意してください。

生のプリミティブから豊富なライブラリを本質的にブートストラップするこの単純な定義のリストを読むことは、「ハスケルの道」への窓を提供するという点で非常に教育的で目を見張るものになる可能性があります。

私は読書の非常に早いahaの瞬間を覚えています:data Bool = False | True

于 2010-09-22T14:46:44.153 に答える