2013-12-18 3 views
4

Я использую функцию fromEnum для преобразования символа в соответствующий ASCII Int. Например:Haskell: Int to Char

fromEnum 'A' 

возвращает 65.

Теперь, предполагая, что у меня была функция, которая сделала:

(fromEnum 'A')+1 

А потом хотел, чтобы преобразовать возвращаемое значение (66) к Чаре, который бы be 'B'. Каков наилучший способ сделать это?

Спасибо!

+3

Почему бы не использовать 'succ'? ([hoogle] (http://hackage.haskell.org/package/base-4.6.0.1/docs/Prelude.html#t:Enum)) –

+0

@MattFenwick, потому что я хочу установить его так, чтобы, если char становится «Z», последовательным является «A», но я думаю, что я могу обойти это с вашим предложением, спасибо! :) – MrD

+3

Я бы предложил переписать вопрос, чтобы описать фактическую проблему, которую вы пытаетесь решить, поскольку ваш комментарий, кажется, подразумевает, что описанная вами проблема не является основной. –

ответ

4

Вы можете использовать succ реализовать поведение, которое вы хотите:

nextLetter :: Char -> Char 
nextLetter c 
    | c == 'Z' = 'A' 
    | otherwise = succ c 
5

Вы можете использовать ord :: Char -> Int и chr :: Int -> Char функции от Data.Char.

> chr (ord 'a' + 1) 
'b' 

Но не забудьте import Data.Char в исходном файле или :m +Data.Char в GHCI.

То же самое с fromEnum :: Enum a => a -> Int и toEnum :: Enum a => Int -> a:

toEnum (fromEnum 'a' + 1) :: Char 

Последняя часть этого выражения говорит Haskell, какой тип мы ожидаем, чтобы помочь тип системы вывести правильный тип. Но в этом случае мы можем упасть :: Char:

isLower $ toEnum (fromEnum 'a' + 1) 

потому что isLower имеет тип Char -> Bool. Поэтому ожидается, что toEnum (fromEnum 'a' + 1) будет Char.

В любом случае, решение bheklilr достаточно хорошее :) Я просто хотел показать вам несколько способов решения вашей проблемы.

+1

Идиоматический путь для более общей задачи 'ord' и' chr'. Я думаю, было бы неплохо указать на это. Однако для этой конкретной задачи решение @bheklilrs было явно короче. – kqr