Вы можете использовать защиту и использовать toUpper :: Char -> Char
, модуля Data.Char
, например:
import Data.Char(toUpper)
yell :: Char -> Char
yell c
| 'a' <= c && c <= 'z' = toUpper c
| otherwise = c
для символов ASCII, верхний регистр просто маскирует шестой бит (с маской 0010 0000
). Таким образом, toUpper
эквивалентно chr . (~0x20 .&.) . ord
для указанного диапазона c.
Однако существуют другие символы, которые имеют заглавные буквы, например символы с диакритическими знаками (àáâãäåæçèéêëìí…
), греческие символы (* 1020) *), символы полной ширины (abcdefgh…
) и др. c. Все они конвертируются с помощью toUpper
и не могут (все) конвертироваться с помощью этого трюка.
Вы можете выполнить поиск с помощью структуры поиска, например, `
import Data.HashMap.Strict(HashMap, fromList)
import qualified Data.HashMap.Strict as HM
items :: HashMap Char Char
items = fromList (zip ['a' .. 'z'] ['A' .. 'Z'])
yell :: Char -> Char
yell c
| Just y <- HM.lookup c items = y
| otherwise = c