Случаи переключения на языке Haskell - PullRequest
0 голосов
/ 26 апреля 2018

Я новичок в Haskell, и у меня возникла проблема с определением функции, которая принимает параметр типа string, возвращает результат типа string и преобразует прописные буквы в строчные и строчные буквы в прописные. Я определил функцию для нижнего и верхнего преобразования отдельно.

Код:

 --upper case
func_upper :: String -> String
func_upper = map (\x-> if x>='a' && x<='z' then 
                    toEnum(fromEnum x-32) else 
                          x)

--Lower case
func_lower :: String -> String
func_lower = map (\x ->if x>='A' && x<='Z' then 
                toEnum (fromEnum x+32) else
                x)

но я не могу объединить эти две функции и создать одну функцию, которая будет выполнять обе операции. Я тренировался, но не смог. Мой тренировочный код:

    func_ ::String -> String
func_  x = if(x>='a' && x<='z') then toEnum (fromEnum x-32) else 
          if (x>='A' && x<='Z')  then toEnum (fromEnum x+32) else
          x

Пожалуйста, помогите мне решить эту проблему, и ваша помощь будет высоко ценится.

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Вы в основном здесь выполняете map пинги. Вы можете переключить регистр, определив сопоставление для данного символа:

  1. проверяет, является ли он символом в верхнем регистре, если это так, возвращает его эквивалент в нижнем регистре;
  2. проверить, является ли он символом в нижнем регистре, если это так, вернуть его эквивалент в верхнем регистре; и
  3. в противном случае вернуть исходный символ.

Мы можем реализовать такую ​​функцию как:

import Data.Char(isLower, isUpper, toLower, toUpper)

toggleChar :: Char -> Char
toggleChar x | isUpper x = toLower x
             | isLower x = toUpper x
             | otherwise = x

или без использования Data.Char импорт:

toggleChar :: Char -> Char
toggleChar x | 'A' <= x && x <= 'Z' = toEnum (fromEnum x - 32)
             | 'a' <= x && x <= 'z' = toEnum (fromEnum x + 32)
             | otherwise = x

тогда мы можем реализовать переключение на всю строку с помощью map ping over toggleChar:

toggleString :: String -> String
toggleString = map toggleChar
0 голосов
/ 06 ноября 2018

Этот подход обрабатывает специальные символы и цифры без импорта:

special = ['0'..'9'] ++ [' ', '!','@','#','$','%','^','&','*','(',')','_','-','+']
alphabet = ['a'..'z'] ++ special ++ ['A'..'Z'] ++ special
idx c (x:xs) | c /= x = 1 + idx c xs
             | otherwise = 0

toggleChar s = alphabet !! mod (idx s alphabet + 26 + length special) (length alphabet)
toggleString = map toggleChar
0 голосов
/ 26 апреля 2018

Во-первых, обратите внимание, что достаточно определить функции только для отдельных символов. Затем вы можете обернуть их в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...