3

2 つの数値リストを含むタプルがあります - ([1,2,3,4],[5,6,7,8])

各リストから対応する数値のペアを合計する必要があります。つまり、(1+5)、(2+6) などです。リストを出力します。つまり、[6,8,10,12] です。また、リスト内の任意の数の要素に対しても機能するはずです (5 個のリストが 2 つ、6 個のリストが 2 つなど)。

「map sum . transpose」を使用して関数を試してみましたが、タイプを正しく取得できないようです (タプル内にあるため)。ここで、リストのリストに対して機能するコードを見つけましたが、リストのタプルに対して同じことを行う方法がわかりません (可能ですか?)。「a」の型を変更しようとしたり、Int を使用しようとすると、型の不一致エラーが発生します。

tupSums :: Num a => [[a]] -> [a]
tupSums = map sum . transpose

私は Haskell を使用するのにかなり慣れていないため、発生するエラーをよく理解していません。質問がばかげていると思われる場合は申し訳ありません。

4

1 に答える 1

10

zipWithこれは、 2 つのリストを取り、特定の演算子を使用してリスト内の対応する要素を結合するの良い候補です。以下が機能するはずです。

tupSums :: Num a => ([a],[a]) -> [a]
tupSums = uncurry $ zipWith (+)

zipWith (+)それぞれがリストである 2 つの引数を取り、対ごとの合計のリストを返す関数に評価されます。uncurry2 つの引数の関数を取り、それを 1 つのタプルを取る関数に変換します。したがってuncurry $ zipWith (+)、リストのタプルを取り、ペアごとの合計を含むリストを返す関数に評価されます。

于 2013-02-14T00:35:38.987 に答える