2016-11-08 2 views
0

私は私が書いているいくつかのコードを持っていると私はダブルスのリストを折る必要がある、しかし、コードのも、このシンプルなライン、すなわち、私が理解しないエラーが発生します:Double型のリストを折りたたむにはどうしたらいいですか?

Couldn't match expected type ‘Double’ 
      with actual type ‘t0 [t1] -> [t1]’ 
Probable cause: ‘foldr’ is applied to too few arguments 
In the expression: foldr (+) [3.3, 1.4, 5.5] 
In an equation for ‘foldDoubles’: 
    foldDoubles = foldr (+) [3.3, 1.4, 5.5] 

の簡単な例:

foldDoubles = foldr(+)[3.3、1.4、5.5]整数の

例は、私は理解しないと同じ形式で、なぜ "少なすぎる引数" があるだろうしている私は必要ですか何らかの変換を行うには?

答えて

4

考えられる原因:「foldr」の数が少なすぎる引数

に適用されるfoldrが少なすぎる引数に適用されるためです。観察:

foldr (+) [3.3, 1.4, 5.5] 
--  one two 

しかし:

:type foldr 
Foldable t => (a -> b -> b) -> b -> t a -> b 
--    one   two three 

あなたはタイプbの引数が不足しています。この場合、あなたはので、おそらくあなたはアキュムレータとしてゼロを使用して、折り目を開始したいの合計をしたいように見える:

foldr (+) 0 ... 
+0

Haskellのウィキとその最初の例を見ていた...それをやったこと、ありがとう '(+)倍された[1、2、3、4 、5] 'これはちょっと誤解を招くかもしれないと思います。 –

+0

@MarcusRuddick' fold'は 'foldr'ではありません。 –

+0

@MarcusRuddickこれは依然として間違っていますが、 'Data.Foldable'からの' fold'の典型的な定義は、関数のパラメータを取っていません。この "haskell wiki"はどこにありますか? Googleは、一回限りのhaskell-lang.orgサイトで表示するのと同じコードを持っています(haskellとは異なります)。org、これは通常 "人々が" thekell wiki "を意味する)ですが、-langサイトはwikiを削除したようです。リソースを指摘できれば、それを修正するために作業することができます。 –

2

foldr関数は三つの引数((a -> b -> b)bt a)を含ん含むFoldable t => (a -> b -> b) -> b -> t a -> bを入力していますあなたは2つの引数だけを含んでいます。

foldDouble = foldr (+) 0 [3.3, 1.4, 5.5] 

をしかし者はさらに少し見てみましょう:私たちは、この間違いを修正するタイプbのベースケースを追加することにより、単一のハードコードリストについては、私たちの計算された折り目を保持するためにfoldDoublesを書き換えることができます。代わりに、リスト[3.3, 1.4, 5.5]をハードコーディングするのは、我々は(これは単に、SUM関数である)のリストを受け取り、それが合計だ返す汎用機能を行うことができます。私たちは私たちのPrelude-のように、一般的なリストに使用することができます

foldDouble xs = foldr (+) 0 xs 

定義されたsum関数:

foldDouble = foldr (+) 0 

最後に、便利な機能があります:

ghci>> foldDouble [3.3, 1.4, 5.5] 
10.2 

次に、我々は、これは少しクリーナー形を取りに行くETA-減らすことができますは、基本ケースを取り除くことを可能にします(リストの最後の要素は、代わりにベースケースとみなされます)。この機能を使用して、我々は0を取り除くことができます。

foldDouble = foldr1 (+) 
+0

ありがとう、私は例としてハードコードされたバージョンを投稿しました...実際のコードはより複雑で、実際に倍精度の可変リストを渡されます –

関連する問題