HaskellでIterateをどのように実装しますか?
-
04-10-2019 - |
質問
iterate :: (a -> a) -> a -> [a]
(おそらくご存知のように) iterate
関数と開始値をとる関数です。次に、関数を開始値に適用し、最後の結果に同じ関数を適用します。
Prelude> take 5 $ iterate (^2) 2
[2,4,16,256,65536]
Prelude>
結果は無限のリストです。 (だから私は使用しています take
)。私の質問あなたはどのようにあなた自身を実装しますか iterate'
Haskellの関数、基本のみを使用して((:)
(++)
ラムダス、パターンマタチング、ガードなど)?
(Haskell初心者)
解決
上手、 反復 値の無限のリストを構築します a で増加します f. 。だから私は何らかの価値を準備した関数を書くことから始めます a 再帰的に繰り返しを呼び出すことによって構築されたリストに FA:
iterate :: (a -> a) -> a -> [a]
iterate f a = a : iterate f (f a)
怠zyな評価のおかげで、私の関数の値を計算するために必要な構築されたリストのその部分のみが評価されます。
他のヒント
また、レポートの基本的なハスケル関数の範囲の簡潔な定義を見つけることができることに注意してください 標準的なプレリュード.
生のプリミティブから豊かなライブラリを本質的にブートストラップするこの単純な定義のリストを読むことは、「Haskell Way」にウィンドウを提供するという点で非常に教育的で目を見張るものです。
私は読書の非常に早いahaの瞬間を覚えています: data Bool = False | True
.
所属していません StackOverflow