我试图从集合中删除一个元素,但我似乎无法正确理解语法。数据类型定义如下:
data Menge el = Menge [el] deriving (Eq, Ord, Show)
其功能为:
loeschen :: (Ord el) => el -> Menge el -> Menge el
loeschen el (Menge []) = Menge []
loeschen el (Menge (x:xs))
| el == x = Menge xs
| otherwise = Menge (x : loeschen el (Menge xs))
错误显示“无法匹配预期类型:[el]与实际类型:Menge el”
我在 (x:) 之后尝试了该部分的多个版本,但总是遇到相同的错误。
提前致谢!
问题是您的
loeschen el (Menge xs)
返回 Menge
,因此您不能将其与 x : loeschen el (Menge xs)
一起使用,因为它需要一个列表作为第二个参数。
但是你可能把这个问题过于复杂化了。您只需打开列表一次,删除项目,然后将结果添加到
Menge
中,例如:
loeschen :: Eq el => el -> Menge el -> Menge el
loeschen el (Menge xs) = Menge (go xs)
where
go [] = []
go (x : xs)
| el == x = xs
| otherwise = x : go xs
delete :: Eq a => a -> [a] -> [a]
实现,因此我们可以将其实现为:
import Data.List (delete)
loeschen :: Eq el => el -> Menge el -> Menge el
loeschen el (Menge xs) = Menge (delete el xs)