Может ли условие, данное функции takeWhile, содержать оператор или? - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь вычислить значение

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 голосов
/ 12 июня 2018

Это невозможно.Прежде всего, вы допустили синтаксическую ошибку: записав (/="E"<b>||/</b>="A"), Haskell видит часть ||/= как оператор single .

Мы можем исправить синтаксическую ошибку и написать:

takeWhile (<b>(/="E") || (/="A")</b>) ls

Но это все еще недействительно, поскольку || ожидает два Bool eans, и здесь операнды имеют значение String -> Bool s.

Тем не менее мы можемрешить эту проблему, например, с помощью выражения lambda :

takeWhile (<b>\x -></b> (<b>x</b> /="E") || (<b>x</b> /="A")) ls

Также существует ошибка семантическая .Тест как x /= c1 || x /= c2, где c1 /= c2 равен всегда True.В самом деле.Первый тест не пройден в случае x == c1, но если c1 /= c2, то мы знаем, что x /= c2, следовательно, это всегда приведет к True.Поэтому вы, вероятно, захотите использовать:

takeWhile (\x -> ( x/="E") <b>&&</b> (/="A")) ls

мы также можем использовать функцию notElem :: Eq a => a -> [a] -> Bool, которая делает код более понятным:

takeWhile (<b>`notElem` ["A", "E"]</b>) ls

или с flip :: (a -> b -> c) -> b -> a -> c:

takeWhile (<b>flip notElem</b> ["A", "E"]) ls
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...