ハスケルを使った関数型プログラミングが初めてで、繰り返しとリストの理解の間にパフォーマンスに違いがあるのだろうかと思っていました。現在、私はに収まる2の最も高いパワーを得るためにlast (takeWhile (< n) (iterate (2*) 1))
を使用しています。私はこれを可能な限り最適化したいと思います。より良い方法がありますか? last
がなければ、n
より低い2の累乗のリストを返します。 last
では、最大値を返します。イテレータのリスト理解のパフォーマンス
例:n
に117を入力すると、出力は64
になり、リストは[1, 2, 4, 8, 16, 32, 64]
になります。
注意してください:リストの理解は魔法ではありません。 '[f x | x < - xs、px] 'は' map'、 'concatMap'、' filter'のように理解されます(この場合は基本的に 'map f(filter p xs)'です)。さらに、 '[a .. b]'は 'enumFromTo a b '(' enumFromTo'は 'Enum'型クラスの一部です)と言ってもいいです。 –
@Rhymoidありがとう、それは本当にいい簡潔な説明です。 –
@Rhymoid実際には、リスト内包は、最適化が有効になっているときに 'foldr'と' build'フォームに変換され、そうでなければあらかじめ最適化された再帰フォームに変換されます。 'map'、' concatMap'、 'filter'は生成されません。 – dfeuer