1

removeユーザーが入力remove 'd' ["abc", "dc", "ad"]して出力を取得できるように、関数を作成しようとしています["abc", "c", "a"]

私のコードは次のとおりです。

remove :: Eq a => a -> [[a]] -> [[a]]
remove a (x:xs) = filter (not.a) (x:xs)

しかし、次のエラー メッセージが表示されます。

Occurs check: cannot construct the infinite type: a = [a] -> Bool
   When generalising the type(s) for `remove'

エラー メッセージの意味と、2 行目を変更するにはどうすればよいですか?

4

2 に答える 2

6

のタイプfilter

filter :: (a -> Bool) -> [a] -> [a]

したがって、渡す最初の引数filterは、リストの要素タイプから への関数でなければなりませんBool。の

remove :: Eq a => a -> [[a]] -> [[a]]
remove a (x:xs) = filter (not.a) (x:xs)

あなたは言う

  1. aは typeaを持ち、リストは type[[a]]を持ちます。つまり、リスト要素の型は[a]であり、
  2. not . aへの最初の引数である のfilter型は[a] -> Boolです。

一緒に、これらは意味します

a = [a] -> Bool

しかし、それは無限型です。

が外側のリストで機能することを意図している場合、または含まれている各リストから要素を削除する場合は、おそらくfilter (not . (a `elem`))、または同等の のようなものを意味していました。filter (a `notElem`)filtermap (filter (/= a))

于 2012-05-03T20:46:32.343 に答える
5

引数aは、同等性をサポートする任意の型であると述べています。

しかし、それをブール式で使用します: not . a.

の型not:: Bool -> Boolであるため、型であるa必要がありますBool。しかし、あなたはすでにいいえ、それはタイプだったと言いましたEq t => t

それはタイプエラーです。

equal ではないすべての要素をフィルタリングすることを意味していると思いますa。これは次のようになります。

remove a xs = filter (/= a) xs 

ただし、入力もネストされたリストであるため、フィルターを内部要素にマップする必要があります。

remove a xs = map (filter (/= a)) xs
于 2012-05-03T20:46:08.947 に答える