0

より高い機能を使用して、タプルのリストをコンポーネントごとに追加しようとしています。結果は (最初のコンポーネントの合計、2 番目のコンポーネントの合計) になります。

sumPointwise    :: Num a => [(a,a)] -> (a,a)
sumPointwise tl = (sumPw1, sumPw2)                         -- 42:1
  where sumPw1  = foldr (\ x y -> (fst x) + (fst y)) 0 tl
        sumPw2  = foldr (\ x y -> (snd x) + (snd y)) 0 tl

しかし、次のエラーが発生します。

Couldn't match type `a' with `(a, b0)'
  `a' is a rigid type variable bound by
      the type signature for sumPointwise :: Num a => [(a, a)] -> (a, a)
      at .hs:42:1
In the first argument of `fst', namely `y'
In the second argument of `(+)', namely `(fst y)'
In the expression: (fst x) + (fst y)

ラムダ関数が間違っているようです。しかし、私はそれを取得しません。

ご協力いただきありがとうございます!

4

1 に答える 1

3

の 2 番目の引数foldrは集計値:foldr :: (a -> b -> b) -> b -> [a] -> bです。したがって、式は次のようになります

sumPw1 = foldr (\ x s -> (fst x) + s) 0 tl

あなたの仕事を解決するより簡潔な方法は

sumPointwise tl = let (xs, ys) = unzip tl in (sum xs, sum ys)
于 2013-06-09T12:50:25.770 に答える