많은 언어에서 어떤 정수 i에 대해 'A' + i
을 쓰면 알파벳 문자를 얻을 수 있습니다. 어떻게 하스켈에서 이것을 할 수 있습니까? (그리고 또한 역 동작 let ch = 'B' in (ch - 'A')) == 1
등)하스켈의 문자 계산
Prelude> 'A' + 1
No instance for (Num Char) arising from a use of `+'
많은 언어에서 어떤 정수 i에 대해 'A' + i
을 쓰면 알파벳 문자를 얻을 수 있습니다. 어떻게 하스켈에서 이것을 할 수 있습니까? (그리고 또한 역 동작 let ch = 'B' in (ch - 'A')) == 1
등)하스켈의 문자 계산
Prelude> 'A' + 1
No instance for (Num Char) arising from a use of `+'
으로는 의견에서 지적, 당신은 Data.Char
에서 기능 Int
및 Char
사이에 변환 할 수 있습니다. 그러나 이것은 당신이 요구하는만큼 묵시적이지 않습니다. 당신이 정말 원하는 경우
, 당신은 이론적으로, 예를 들어 다음과 같이 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'
의 값을 검사 할 경우 발생하는 특정 통지에
. 1
이 Char
으로 변환 되었기 때문에 위의 평등 확인이 작동하지만 역순으로 암시 적 변환을하지는 않습니다.
나는 또한 Num
에서 다른 작업을 생략 했으므로 컴파일러 경고가 표시되고 일부 작업이 작동하지 않습니다. 같은 줄을 따라 추가 할 수는 있지만 훨씬 의미가 없습니다.
''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
그건 그렇고,'Char'는 ['Enum']의 인스턴스입니다 (http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.7.0.1/Prelude.html#t : Enum). – MasterMastic