Haskell: сравнение персонажей - PullRequest
0 голосов
/ 28 октября 2019

Я хочу создать согласную функцию, которая проверяет, является ли символ согласным (True) или гласным (False). Я пытаюсь что-то вроде этого:

consonant :: Char -> Bool
consonant x = if (x == 'a'|'e'|'i'|'o'|'u'|' ') then False else True

Но это не работает, я думаю, что это просто проблема с синтаксисом. Я надеюсь, что кто-нибудь может мне помочь :) Спасибо

1 Ответ

3 голосов
/ 28 октября 2019

Выражение x == 'a'|'e'|'i'|'o'|'u'|' ' не имеет смысла, символ канала (|) используется для охранников или при определении нескольких конструкторов данных для типа данных.

Замена | на (||) :: Bool -> Bool -> Bool тоже не поможет, поскольку 'e' не является Bool. Однако мы можем написать несколько условий:

consonant :: Char -> Bool
consonant x = not (x == 'a'<b>|| x ==</b> 'e'<b>|| x ==</b> 'i'<b>|| x ==</b>'o'<b>|| x ==</b>'u'<b>|| x ==</b>' ')

, или мы можем использовать elem :: (Eq a, Foldable f) => a -> f a -> Bool:

consonant :: Char -> Bool
consonant = not . <b>flip elem "aeiou "</b>

, или мы можемиспользуйте оператор секционирования, как @ leftroundabout предлагает :

consonant :: Char -> Bool
consonant = not . <b>(`elem` "aeiou ")</b>

или выполните «переворачивание» себя с помощью переменной:

consonant :: Char -> Bool
consonant <b>x</b> = not (elem <b>x</b> "aeiou ")

Или мы можем сделатьиспользуйте notElem :: (Eq a, Foldable f) => a -> f a -> Bool, который отменяет elem:

consonant :: Char -> Bool
consonant = (<b>`notElem`</b> "aeiou ")
...