我正在尝试计算值
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
但这仍然是无效的,因为||
期望两个Bool
ean,而这里的操作数是String -> Bool
s。
尽管如此,我们还是可以解决这个问题,例如使用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