删除集合中的元素

问题描述 投票:0回答:1

我试图从集合中删除一个元素,但我似乎无法正确理解语法。数据类型定义如下:

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:) 之后尝试了该部分的多个版本,但总是遇到相同的错误。

提前致谢!

haskell set abstract-data-type
1个回答
0
投票

问题是您的

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)
© www.soinside.com 2019 - 2024. All rights reserved.