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

onu*_*tas 1 haskell functional-programming

我正在尝试计算价值

takeWhile (/="E"||/="A") ls
Run Code Online (Sandbox Code Playgroud)

哪里

ls = ["EVENT","6010","A","CHECK_PROMOTION_ELIGIBLE","-1","E","RUN_EVENT","6020"]
Run Code Online (Sandbox Code Playgroud)

但是,ghci表示为

Variable not in scope: (||/=) :: [Char] -> [Char] -> [Char]
Run Code Online (Sandbox Code Playgroud)

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

我试图删除||/="A"部分,然后没有错误.

Wil*_*sem 8

那是不可能的.首先,您提出了语法错误:通过编写Haskell将该部分视为单个运算符.(/="E"||/="A")||/=

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

takeWhile ((/="E") || (/="A")) ls
Run Code Online (Sandbox Code Playgroud)

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

不过我们可以解决这个问题,例如使用lambda表达式:

takeWhile (\x -> (x /="E") || (x /="A")) ls
Run Code Online (Sandbox Code Playgroud)

还有一个语义错误.类似的测试x /= c1 || x /= c2,其中c1 /= c2始终 True.确实.第一次测试失败了x == c1,但如果c1 /= c2,那么我们知道x /= c2,因此它总是会导致True.所以你可能想要使用:

takeWhile (\x -> ( x/="E") && (/="A")) ls
Run Code Online (Sandbox Code Playgroud)

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

takeWhile (`notElem` ["A", "E"]) ls
Run Code Online (Sandbox Code Playgroud)

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

takeWhile (flip notElem ["A", "E"]) ls
Run Code Online (Sandbox Code Playgroud)

  • `(||)<$>(/ ="A")<*>(/ ="E")`但实际上写的是,最简单的方法是`const True`,所以问题可能是错的. (2认同)
  • "Functor"方法并不需要完全理解*为什么*函数是函子.知道`(&&)ab`是另一种写'a && b`的方法是一个好的开始,假装`(&&)<$> f <*> g`只是`\ x - >的语法糖( &&)(fx)(gx)`会让你相当远. (2认同)