2014-10-07 2 views
2

많은 언어에서 어떤 정수 i에 대해 'A' + i을 쓰면 알파벳 문자를 얻을 수 있습니다. 어떻게 하스켈에서 이것을 할 수 있습니까? (그리고 또한 역 동작 let ch = 'B' in (ch - 'A')) == 1 등)하스켈의 문자 계산

Prelude> 'A' + 1 
    No instance for (Num Char) arising from a use of `+' 
+4

''Data.Char'의'ord'와''chr' (http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.7.0.1/Data-Char.html) #g : 6) Int와 Char 사이의 변환. – Vektorweg

+2

그건 그렇고,'Char'는 ['Enum']의 인스턴스입니다 (http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.7.0.1/Prelude.html#t : Enum). – MasterMastic

답변

6

으로는 의견에서 지적, 당신은 Data.Char에서 기능 IntChar 사이에 변환 할 수 있습니다. 그러나 이것은 당신이 요구하는만큼 묵시적이지 않습니다. 당신이 정말 원하는 경우

, 당신은 이론적으로, 예를 들어 다음과 같이 Num 인스턴스를 만들 수 있습니다

import Data.Char (chr, ord) 

instance Num Char where 
    c1 + c2 = chr (ord c1 + ord c2) 
    c1 - c2 = chr (ord c1 - ord c2) 
    fromInteger = chr . fromInteger 

을 그리고 당신은

> 'A' + 1 
'B' 

> 'B' - 'A' == 1 
True 

를 얻을하지만 오히려 Char 때문에 해킹 실제로는 숫자가 아닙니다.

> 'B' - 'A' 
'\SOH' 

즉 당신이 실제로 Int로 보는 것이 아니라 문자 1를 얻을 : 당신이 실제로 'B' - 'A'의 값을 검사 할 경우 발생하는 특정 통지에

. 1Char으로 변환 되었기 때문에 위의 평등 확인이 작동하지만 역순으로 암시 적 변환을하지는 않습니다.

나는 또한 Num에서 다른 작업을 생략 했으므로 컴파일러 경고가 표시되고 일부 작업이 작동하지 않습니다. 같은 줄을 따라 추가 할 수는 있지만 훨씬 의미가 없습니다.

+0

아름다운 대답 – osager

+0

'Signum'과 같은 다른 Num Class 함수를 구현할 필요가 없습니까? – osager

+0

마지막 단락에서 (ninja가 편집 했으므로 원래 보지 못했을 수도 있음) 언급했는데, 이론적으로는 몇 가지 요소가 필요할 것입니다. 그러나 'Char'에 대한 설명은 더 이상하지 않아서 생략했습니다. 설명의 목적. –