我试图计算值
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" 部分,然后没有错误。
答案 0 :(得分:8)
那不可能。首先,您提出了语法错误:通过编写(/="E"||/="A")
Haskell将||/=
部分视为单个运算符。
我们可以修复语法错误,然后写:
takeWhile ((/="E") || (/="A")) ls
但这仍然无效,因为||
期望两个 Bool
eans,这里的操作数为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