2013-12-18 4 views
4

문자를 해당 ASCII Int로 변환하려면 fromEnum 함수를 사용하고 있습니다. 예를 들어 :Haskell : int to Char

fromEnum 'A' 

반환 65

지금, 나는 한 함수했다 가정하면

(fromEnum 'A')+1 

을 한 후 숯불에 반환 된 값 (66)을 변환하고 싶어하는 것 'B'가 되라. 그렇게하는 가장 좋은 방법은 무엇입니까?

감사합니다.

+3

왜 'succ'를 사용하지 않습니까? ([hoogle] (http://hackage.haskell.org/package/base-4.6.0.1/docs/Prelude.html#t:Enum)) –

+0

@MattFenwick 그 이유는 내가 char 연속되는 'A'는 'Z'가됩니다. 그러나 나는 당신의 제안으로 그 문제를 해결할 수 있다고 생각합니다. 감사합니다! :) – MrD

+3

당신이 말한 문제가 루트 문제가 아니라는 것을 암시하는 것처럼 보이므로 실제 문제를 설명하기 위해 다시 작성하는 것이 좋습니다. –

답변

4

당신은 당신이 원하는 동작을 구현하기 위해 succ을 사용할 수 있습니다 : 당신은 Data.Char에서 ord :: Char -> Intchr :: Int -> Char 기능을 사용할 수 있습니다

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

.

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

하지만 ghci에서 소스 파일에 import Data.Char 또는 :m +Data.Char하는 것을 잊지 마십시오.

fromEnum :: Enum a => a -> InttoEnum :: Enum a => Int -> a과 같은 일 :

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

이 식의 마지막 부분은 우리가 타입 시스템이 적당한 유형을 추론 할 수 있도록 기대하고 하스켈 유형을 말한다. 그러나이 경우 우리는 :: Char을 드롭 할 수 있습니다 Char -> Bool을 입력있다

isLower $ toEnum (fromEnum 'a' + 1) 

isLower 때문이다. 따라서 toEnum (fromEnum 'a' + 1)Char이 될 것으로 예상됩니다.

어쨌든 bheklilr의 해답은 충분합니다 :) 저는 여러분에게 문제를 해결할 수있는 몇 가지 방법을 보여주고 싶었습니다.

+1

좀 더 일반적인 문제인 'ord'와'chr'에 대한 관용구. 나는 그것을 지적하는 것이 좋은 생각이라고 생각합니다. 그러나이 특별한 문제 때문에 @bheklilrs 솔루션은 분명히 짧았습니다. – kqr