2017-08-17 9 views
0

私はHaskellのに新たなんだと、ここで私が何をしたいです: enter image description hereグループの連続同様の要素

これまでのところ唯一のコンパイルエラー:

groupElems :: Eq a => [a] -> [[a]] 
groupElems [] = [] 
groupElems (x:xs) = 
    let (a,b) = span (<= x) xs 
    in a : (groupElems b) 

ありがとうございました。

エラー:aクラスEqでなければなりませんように

Could not deduce (Ord a) arising from a use of ‘<=’ 
from the context (Eq a) 
    bound by the type signature for groupElems :: Eq a => [a] -> [[a]] 
+0

を:

groupElems :: Eq a => [a] -> [[a]] groupElems [] = [] groupElems [email protected](x:_) = let (a,b) = span (== x) xa -- use == instead of <= in a : (groupElems b)

その後、生成します。

あなたは平等によってグループ化したい場合、あなたは(==) :: Eq a => a -> a -> Bool機能を使用する必要があります。さらに、単に「コンパイラエラーがあります」で停止するのではなく、エラーが何を意味すると思うかを示すことができます。通常、コンパイラは、エラーの内容を説明することを目的としています。 –

答えて

8

コンパイラは述べていますtypeclass:<=はどこから来たのですか?と尋ねると、わかりました:

Prelude> :i (<=) 
class Eq a => Ord a where 
    ... 
    (<=) :: a -> a -> Bool 
    ... 
    -- Defined in ‘GHC.Classes’ 
infix 4 <= 

したがって、Ordの型クラスを使用して問題を解決できます。つまり、要素が注文されたことを意味します。しかし、あなたの例に基づいてこれはではなく、です。我々は同様に、型制約としてOrd aを使用する場合:

groupElems :: Ord a => [a] -> [[a]] 
groupElems [] = [] 
groupElems (x:xs) = 
    let (a,b) = span (<= x) xs 
    in a : (groupElems b)

第二の問題は、私たちがxsリストにspanを呼び出す*ということです。 xsはリストのテールです。つまり、我々は頭を考慮に入れないことを意味します。我々が得られます

groupElems :: Ord a => [a] -> [[a]] 
groupElems [] = [] 
groupElems [email protected](x:_) = 
    let (a,b) = span (<= x) xa 
    in a : (groupElems b)

:最後のテストケースが正しくないこと

GHci > groupElems [] 
[] 
GHci > groupElems [1,2] 
[[1],[2]] 
GHci > groupElems [1,2,2,2,4] 
[[1],[2,2,2],[4]] 
GHci > groupElems [1,2,3,2,4] 
[[1],[2],[3,2],[4]] 

注意を私たちは、別名@を使用することによって、これを変更し、リスト全体xaを処理することができます。これは、32の両方が<= 3述語を満たすためです。あなたが得るエラーを投稿してください

GHci > groupElems [] 
[] 
GHci > groupElems [1,2] 
[[1],[2]] 
GHci > groupElems [1,2,2,2,4] 
[[1],[2,2,2],[4]] 
GHci > groupElems [1,2,3,2,4] 
[[1],[2],[3],[2],[4]] 
2

あなたの機能を制約しています。ただし、関数<=Ordの型クラスに属します。これに機能注釈を変更してみてください:

groupElems :: Ord a => [a] -> [[a]] 
+0

ありがとう、私は動いたが、本の演習は私にこのシグネチャーグループを与えるElems :: Eq a => [a] - > [[a]] – Oleg

+2

なぜ、より小さいか等しい-に?なぜ、平等を比較してみませんか? –

3

コンパイラはaが原因<=を使用しての、Ord型クラスのインスタンスでなければならないと述べています。

groupElems :: Ord a => [a] -> [[a]] 

しかし、あなたはまだEqを使用する必要がある場合は、あなたの代わりに<===を使用することができますし、コードは動作します:だから、あなたは、このようにコードを修正することができます。

あなたは全体ではなく、リストのxsを通過したので、私はまた、コードのバージョンが[1,2,2,3,3]例に[1, [], [3]]を返したこと、気づきました。ところで

groupElems :: Eq a => [a] -> [[a]] 
groupElems [] = [] 
groupElems [email protected](x:xs) = 
    let (a,b) = span (== x) all 
    in a : (groupElems b) 

は、あなたが達成しようとしているん正確に何Data.Listモジュールでgroup機能があります

2

私は何を探していることはData.List.groupだと思います。 Haskellのコンパイラは言うことを目指し何

Could not deduce (Ord a) arising from a use of ‘<=’ 
from the context (Eq a) 
    bound by the type signature for groupElems :: Eq a => [a] -> [[a]] 

あなたは <= xオムあなたのコードを使用することですが、 <=機能は Eqない一部です:

Prelude> Data.List.group [1,2,2,2,4] 
[[1],[2,2,2],[4]] 
関連する問題