Это невозможно.Прежде всего, вы допустили синтаксическую ошибку: записав (/="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