在许多语言中,您可以为某个整数i编写'A' + i
来获取字母表中的字母。我怎么能在Haskell中做到这一点? (还有像let ch = 'B' in (ch - 'A')) == 1
)
Prelude> 'A' + 1
No instance for (Num Char) arising from a use of `+'
答案 0 :(得分:6)
正如评论中所指出的,您可以使用Int
中的函数在Char
和Data.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'
:
> 'B' - 'A'
'\SOH'
即。你获得了角色1
,而不是真正将其视为Int
。上面的等式检查有效,因为1
转换为Char
,但您没有反向隐式转换。
我还省略了Num
中的其他一些操作,因此您将收到编译器警告,并且某些操作将无法正常工作。你可以沿着相同的行添加它们,但它们的含义更少。