Во-первых, обратите внимание, что достаточно определить функции только для отдельных символов. Затем вы можете обернуть их в map
позже для работы со строками.
Итак, у вас есть
toUpper :: Char -> Char
toUpper x = if x>='a' && x<='z' then
toEnum(fromEnum x-32) else
x
toLower :: Char -> Char
toLower x = if x>='A' && x<='Z' then
toEnum (fromEnum x+32) else
x
... или, как они лучше написаны
toUpper x
| x>='a' && x<='z' = toEnum $ fromEnum x - 32
| otherwise = x
toLower x
| x>='A' && x<='Z' = toEnum $ fromEnum x + 32
| otherwise = x
Теперь, с этим синтаксисом guard приятно то, что вы можете просто добавить больше предложений. Поэтому все, что вам нужно сделать, это поместить условные предложения обеих функций в одну. В первом случае будет указано, как вычислить результат.
Эквивалентная вещь также может быть сделана с if
, но это требует неуклюжего вложения в ветку else
.