所以我想要一个以字符串和列表作为参数的函数,并检查该元素是否已经在列表中,如果是,则返回相同的列表,如果不是,则将其添加到列表中然后把它还给它,'我是一个带哈斯克尔的笨蛋,所以我试过没有成功的事情:
check:: String ->[String] ->[String]
check x [] = []++[x]
check x (y:xs)
| x==y = (y:xs)
| otherwise = check x xs
有人可以指路吗? THKS
答案 0 :(得分:6)
您可以使用现有功能 elem http://hackage.haskell.org/package/base-4.7.0.0/docs/Prelude.html#v:elem
check x ls
| x `elem` ls = ls
| otherwise = (x:ls)
如果您想完全依靠学习目的,我建议重新实施 elem 。
答案 1 :(得分:2)
要实现check
,我们需要将第二个参数l
的元素与其第一个参数x
逐个进行比较。 l
的这些元素不等于x
应该是最终结果的元素。如果我们发现l
的元素等于x
,则无需将l
的其余部分与x
进行比较。
所以check
可以使用像这样的递归来实现
check x [] = [x]
check x l@(y:ys)
| x == y = l -- `l` is `y:ys`
| otherwise = y : check x ys
说明:
如果第二个参数是空列表,则结果为[x]
;
否则,如果第二个参数的头部等于其第一个参数,则结果应该是第二个参数;
最后,第二个参数的头部应该是最终结果的一部分,我们应该递归地检查其第二个参数的其余部分。