コンパイラは述べています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
を処理することができます。これは、3
と2
の両方が<= 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]]
を:
その後、生成します。
あなたは平等によってグループ化したい場合、あなたは
(==) :: Eq a => a -> a -> Bool
機能を使用する必要があります。さらに、単に「コンパイラエラーがあります」で停止するのではなく、エラーが何を意味すると思うかを示すことができます。通常、コンパイラは、エラーの内容を説明することを目的としています。 –