首先,類型簽名的格式不正確。
deleteAllInstances :: (a, [l]) => a -> [l] -> [l]
A型簽名的形式
name :: (Constraints) => type
其中Constraints
涉及類型類,像(Ord a, Show a)
。在這種情況下,該功能使用(==)
,因此必須有Eq a
的限制。
然後函數定義與類型部分不匹配,您定義它將一對作爲參數,而類型簽名另有說明(您的定義不確定,類型爲curried)。
deleteAllInstances (a, []) = []
deleteAllInstances (i, (x:xs))
| i == x = tail
| otherwise = x ++ tail
where tail = deleteAllInstances i xs
然後使用(++)
一個元素膠水列表的前面,但(++)
連接兩個列表,你需要(:)
這裏。
定義函數是使用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-11 21:27:40