在Haskell中查找或插入新元素到字符串列表

时间:2014-06-01 02:37:15

标签: haskell

所以我想要一个以字符串和列表作为参数的函数,并检查该元素是否已经在列表中,如果是,则返回相同的列表,如果不是,则将其添加到列表中然后把它还给它,'我是一个带哈斯克尔的笨蛋,所以我试过没有成功的事情:

check:: String ->[String] ->[String]
check x [] = []++[x]
check x (y:xs) 
             | x==y = (y:xs)
             | otherwise = check x xs 

有人可以指路吗? THKS

2 个答案:

答案 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

说明:

  1. 如果第二个参数是空列表,则结果为[x];

  2. 否则,如果第二个参数的头部等于其第一个参数,则结果应该是第二个参数;

  3. 最后,第二个参数的头部应该是最终结果的一部分,我们应该递归地检查其第二个参数的其余部分。