为什么守卫的陈述没有运行?

时间:2016-04-17 23:26:48

标签: haskell

你好,我是在我们刚刚介绍给Haskell的编程语言课程中。所以在作业中我们必须创建一个可以删除列表中元素的多个实例的函数。我有一个可以删除一个元素的上一个函数,但我的removeMultipleElements不想运行受保护的语句,只是直接进入空列表。任何帮助表示赞赏。我确定这是语法上的东西,但我不确定是什么。

这是代码

--This one works great    
removeElement x aList@(y:ys)
        | y == x = rest
        | otherwise = y : rest
          where
            rest = removeElement x ys 
    removeElement _ _ = []

--this does not want to
removeMultipleElements remove@(y:ys) aList@(x:xs) 
        | elem y aList = removeMultipleElements ys (removeElement y aList)
        | not (elem y aList) = removeMultipleElements ys aList
        | otherwise = aList
removeMultipleElements _ _ = []

1 个答案:

答案 0 :(得分:3)

问题不在于警卫,而在于

removeMultipleElements remove@(y:ys) aList@(x:xs) 
只有当两个列表都不为空时才会匹配

,所以在你的基本情况下你有

removeMultipleElements [] aList

仅与第二个定义匹配,因此成为空列表。你可能应该替换

removeMultipleElements _ _ = []

类似

removeMultipleElements _ xs = xs