3

haskellを使用してリスト内のアイテムのすべてのインスタンスを削除しようとしています。よくわからないエラーが発生します。誰かが私を助けて、私が正しいことをしているのかどうか私に知らせてもらえますか?

deleteAllInstances :: (a, [l]) =>  a -> [l] -> [l]
deleteAllInstances (a, []) = []
deleteAllInstances (i, (x:xs))
    | i == x = tail
    | otherwise = x ++ tail
    where tail = deleteAllInstances i xs
4

3 に答える 3

9

まず、型署名の形式が正しくありません。

deleteAllInstances :: (a, [l]) =>  a -> [l] -> [l]

型署名の形式は

name :: (Constraints) => type

ここでConstraints、のような型クラスが含まれ(Ord a, Show a)ます。この場合、関数はを使用する(==)ため、形式の制約が必要Eq aです。

次に、関数定義が型部分と一致せず、引数としてペアを取るように定義しましたが、型シグネチャは別のことを示しています(定義はカレーなし、型はカレー付き)。

deleteAllInstances (a, []) = []
deleteAllInstances (i, (x:xs))
    | i == x = tail
    | otherwise = x ++ tail
    where tail = deleteAllInstances i xs

次に(++)、要素をリストの先頭に接着するために使用しますが(++)、2つのリストを連結します。ここで必要(:)です。

関数を定義する最も簡単な方法は、filter

deleteAllInstances :: Eq a => a -> [a] -> [a]
deleteAllInstances a xs = filter (/= a) xs

ただし、明示的な再帰を自分で実行したい場合は、

deleteAllInstances :: Eq a => a -> [a] -> [a]
deleteAllInstances a (x:xs)
    | a == x    = rest
    | otherwise = x : rest
      where
        rest = deleteAllInstances a xs
deleteAllInstances _ _ = []
于 2012-04-11T21:32:25.657 に答える
4

(a, [l])前に何をしようとしているのかわかりません=>が、必要ないと思います。構文は通常、aとlが満たすべきタイプを指定するために予約されています。

また、関数は、関数定義の後半で指定したように、2つの引数とを取りますa[l]ただし、関数の実装は1つの引数、タプルのみを取ります。前に述べたように、タプルは引数がどのタイプであるかを指定するためだけに機能し、パターンを照合することはできません。

deleteAllInstances :: a -> [l] -> [l]
deleteAllInstances a [] = []
deleteAllInstances i (x:xs)
    | i == x = rest
    | otherwise = x : rest
    where rest = deleteAllInstances i xs

を使用して記述したい場合はfilter、いつでも次のコードを使用できます

deleteAllInstances :: a -> [a] -> [a]
deleteAllInstances a = filter (/=a)
于 2012-04-11T21:31:10.893 に答える
3

私は実際、リスト内包表記がこのような問題の非常に直感的な表記法であることに気づきました。

deleteAllInstances :: Eq a => a -> [a] -> [a]
deleteAllInstances a list = [x | x <- list, x /= a]
于 2013-06-16T03:17:04.067 に答える