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表示为
Run Code Online (Sandbox Code Playgroud)Variable not in scope: (||/=) :: [Char] -> [Char] -> [Char]
是否存在语法问题,或者只是||在指定takeWhile函数条件时我们不能使用运算符?
我试图删除||/="A"部分,然后没有错误.
那是不可能的.首先,您提出了语法错误:通过编写Haskell将该部分视为单个运算符.(/="E"||/="A")||/=
我们可以修复语法错误,并写:
takeWhile ((/="E") || (/="A")) lsRun Code Online (Sandbox Code Playgroud)
但这仍然是无效的,因为||期望两个 Bool eans,这里的操作数是String -> Bools.
不过我们可以解决这个问题,例如使用lambda表达式:
takeWhile (\x -> (x /="E") || (x /="A")) lsRun Code Online (Sandbox Code Playgroud)
还有一个语义错误.类似的测试x /= c1 || x /= c2,其中c1 /= c2是始终 True.确实.第一次测试失败了x == c1,但如果c1 /= c2,那么我们知道x /= c2,因此它总是会导致True.所以你可能想要使用:
takeWhile (\x -> ( x/="E") && (/="A")) lsRun Code Online (Sandbox Code Playgroud)
我们也可以使用该notElem :: Eq a => a -> [a] -> Bool函数,这使代码更自我解释:
takeWhile (`notElem` ["A", "E"]) lsRun Code Online (Sandbox Code Playgroud)
或者flip :: (a -> b -> c) -> b -> a -> c:
takeWhile (flip notElem ["A", "E"]) lsRun Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |