あなたの問題は、主にタイプや値が混在していることが原因であると考えられます。これは、初心者、特にリストで発生する可能性があります。混乱はおそらく、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
'sum'が十分でなければなりません地図... – Alec
ヘッドアップ:私はより良い根本的な問題を反映するためにタイトルを変更している、と(Iエラーに言及することをあなたは見た。) (そのような場合は、あなたが得るエラーを引用することは常に良い考えです)。 – duplode