まず、型署名の形式が正しくありません。
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 _ _ = []