Haskell中的Char算术

时间:2014-10-07 17:23:16

标签: haskell char

在许多语言中,您可以为某个整数i编写'A' + i来获取字母表中的字母。我怎么能在Haskell中做到这一点? (还有像let ch = 'B' in (ch - 'A')) == 1

这样的反向操作
Prelude> 'A' + 1
    No instance for (Num Char) arising from a use of `+'

1 个答案:

答案 0 :(得分:6)

正如评论中所指出的,您可以使用Int中的函数在CharData.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中的其他一些操作,因此您将收到编译器警告,并且某些操作将无法正常工作。你可以沿着相同的行添加它们,但它们的含义更少。