给定 takeWhile 函数的条件可以包含 or 运算符吗?



我正在尝试计算值

takeWhile (/="E"||/="A") ls

哪里

ls = ["EVENT","6010","A","CHECK_PROMOTION_ELIGIBLE","-1","E","RUN_EVENT","6020"]

然而,ghci 包括

Variable not in scope: (||/=) :: [Char] -> [Char] -> [Char]

是否存在语法问题,或者我们不能在为函数指定条件时||运算符takeWhile

我试图删除||/="A">部分,则没有错误。

那样是不可能的。首先,你犯了一个语法错误:通过编写(/="E"||/="A")Haskell将||/=部分视为单个运算符。

我们可以修复语法错误,并编写:

takeWhile ((/="E") || (/="A")) ls

但这仍然是无效的,因为||期望两个Boolean,而这里的操作数是String -> Bools。

尽管如此,我们还是可以解决这个问题,例如使用lambda表达式:

takeWhile (x ->(x/="E") || (x/="A")) ls

还有一个语义错误。像x /= c1 || x /= c2这样的测试,c1 /= c2总是True.事实上。第一个测试在x == c1的情况下失败,但如果c1 /= c2,那么我们知道x /= c2,因此它总是会导致True。因此,您可能希望使用:

takeWhile (x ->( x/="E")&&(/="A")) ls

我们还可以使用notElem :: Eq a => a -> [a] -> Bool函数,它使代码更加自我解释:

takeWhile (`notElem` ["A", "E"]) ls

或带flip :: (a -> b -> c) -> b -> a -> c

takeWhile (flip notElem["A", "E"]) ls

最新更新