2010-11-18 6 views
1

とHaskellで数字の力を加える私はそれが非常に簡単リストの内包表記を実装するのに見つけながらfoldlの

1^2 + 2^2 + 3^2 ... 

のようなものを計算Haskellの関数を作ることが求められています

sum [ k^2 | k <- [1..100]] 

または地図

sum (map (\x -> x*x) [1..100]) 

私は折りたたみでどのように達成するのか苦労しています。

私は間違っていないよ場合は、1本で結果を達成するために、再帰関数で劣らず3以上のパラメータを必要とします。

  1. (nは最大1 ...)現在位置
  2. 現在の合計(私はそれを必要とするように!)

を停止するために、私は、この関数を定義する場合であっても、それはまだタプルではなく、数を返します

  • 誰かが私に何か不足しているかもしれないかについての手がかりを与えるのに十分親切な人はいますか?

    おかげ

  • 答えて

    5

    「現在の位置」(実際には地図とリストの理解版のようにリストの次の項目)とどこで停止するかは、折りたたまれているリストに暗黙のうちに入ります。現在の合計はフォールドの「アキュムレータ」パラメータです。したがって、空白を記入してください:

    foldl (\runningSum nextNumber -> ____) 0 [1..100] 
    
    +1

    ちなみに、私は一般に' foldl''(Dataに定義されています)もお勧めします。これは、すべてのステップでアキュムレータを強制的に評価するためのものです。とにかくGHCでコンパイルすると、それが分かりますが、GHCiやHugsでは、一定の空間で実行されているか、メモリが足りなくなっているかの違いがあります。 – mokus

    6

    あなたがsumの定義を見れば、それだけでsum = foldl (+) 0です。したがって、いずれかのソリューションでsumfoldl (+) 0に置き換えた場合は、foldlを使用するソリューションがあります。

    mapの2つ目の引数の2乗を最初の引数に加算する関数を使用して、リスト内包またはmapの必要性を取り除くこともできます。

    再帰関数に関する考慮事項がどこにあるのかわかりません。 foldlを使用している場合は、再帰を使用する必要はありません(ただし、foldlは再帰を使用して実装されています)。

    しかし、再帰関数には3つの引数が必要であるということは間違っています。リスト内の各要素の2乗を合計する再帰関数は、リストを取ってリストの先頭をリストの末尾にある関数を呼び出した結果。基本ケースはsquareSum [] = 0です。しかしこれはfoldlとは何の関係もありません。

    +0

    考えてもいいですが、それはちょっと違うようです。私はそれが教師が求めていることを信じていません:( –

    +0

    @devoured:他に何が求められるのか分かりません(私はおそらく 'マップ'とリストの解説を私のもし割り当てが 'foldl'を使うと言うなら、あなたは明示的な再帰を使うべきではありません。 – sepp2k

    関連する問題