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

时间:2018-06-12 16:25:41

标签: haskell functional-programming

我试图计算值

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" 部分,然后没有错误。

1 个答案:

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