2017-02-14 12 views
0

私がしようとしているのは、リストのリストを合計することです。私が何をしたいの例:リストのリストを集計するときに「網羅的でないパターン」エラーが発生する

入力[[1,2,3],[2,5],[6,7]]

出力[6,7,13]

外リスト内のリストの量は、各内側のリストに異なり、整数の量ができ変更することができます。私は物事の多くを試してみたが、これは私が試した最後のものであるが、それは動作しません:

sumSubsets [[x]] = map sum [[x]] 

はまた、私はsumSubsets [] = [[]]の基本ケースを望んでいたが、それは同様にエラーが発生します。どんな助けもありがとう。

+0

'sum'が十分でなければなりません地図... – Alec

+0

ヘッドアップ:私はより良い根本的な問題を反映するためにタイトルを変更している、と(Iエラーに言及することをあなたは見た。) (そのような場合は、あなたが得るエラーを引用することは常に良い考えです)。 – duplode

答えて

2

あなたは

sumSubsets [[x]] = map sum [[x]] 

まずシングルを含むリストと一致する[[x]]を使用してパターンマッチを行い、あなたの前のコード

sumSubsets x = map sum x 

あるいは

sumSubsets = map sum 

を使用することができます要素、それ自体です単一の要素を含むリスト従って、[[1,2,3]]または[[1],[2]][[3]]

>> sumSubsets [[3]] 
[3] 

ではなく、上で正しく動作します。

+0

Woooow、大丈夫です。角括弧はそれを台無しにしていたとは信じられません。私はコンセプトが正しいことを知っていた。 OK。ありがとうございました。 質問には、xはちょうど効果がありますが、[x]や[[x]]はなぜですか? – MandyLB

+1

'[[x]]'は、正確に1つのリストを含むリストのパターンです。ちょうど '[x]'がちょうど1つの要素を持つリストです。ただ 'x'は任意の形状の任意の入力です –

+0

別の質問。 [6,7,13]の代わりに[[6]、[7]、[13]]の出力を得るためにコードを変更する必要がありますか? – MandyLB

0

あなたの問題は、主にタイプや値が混在していることが原因であると考えられます。これは、初心者、特にリストで発生する可能性があります。混乱はおそらく、Haskellでは[]がデータコンストラクタと型コンストラクタとして使用されているという事実から来ていると考えられます。

たとえば、[Int]は「Intsのリスト」(タイプ)を意味しますが、[1]は「1つの要素、つまり番号1を含むリスト」を意味します(値 - つまり、リスト全体が値です) 。どちらのものを一緒:

xs :: [Int] 
xs = [1] 

あなたは多型の関数を書くときIntのようなものから、あなたは抽象的な。たとえば、リストの最初の要素を取得する場合は、整数リストや文字リスト、さらにはリストのリストなど、リストの種類に応じて関数を定義することができます。

firstElement :: [a] -> a 
firstElement (x:xs) = x 

[a]は「a型の要素を持つリスト」を意味し、aは「型aの何か」を意味します。 firstElementは、a型の要素を持つリストからa型の要素への関数です。 aは型変数です。あなたはaがどうあるべきかを言っていないので、この関数はリストのすべての種類のために動作します:

*Main> firstElement [1,2,3] 
1 

*Main> firstElement ['a','b'] 
'a' 

*Main> firstElement [[1,2],[3,4]] 
[1,2] 

あなたはおそらくだろうこれは、関数の最初の引数の型を考えていた[[x]]書いたとき、型xの要素のリストのリスト(xは型変数)。あなたはまだそれを使用することができますが、あなたの関数の型シグネチャ(ダブルコロンを含む行)に入れてする必要があります。それはより一般的なので、私が代わりにxのここaを使用しました

sumSubsets :: Num a => [[a]] -> [a] 
sumSubsets xs = map sum xs 

完了しましたが、xも使用できます。残念ながら、タイプaの追加要件を記述するNum a(これは数値に属しています。他のものについては、sumが定義されていないため)がすべて複雑です。問題を単純化するために、次のように書くことができます:

sumSubsetsInts :: [[Int]] -> [Int] 
sumSubsetsInts xs = map sum xs 
関連する問題