Haskell中的Char算术

Qwe*_*tie 2 haskell char

在许多语言中,您可以写'A' + i一些整数i来获得字母表的字母.我怎么能在Haskell中做到这一点?(还有反向操作let ch = 'B' in (ch - 'A')) == 1)

Prelude> 'A' + 1
    No instance for (Num Char) arising from a use of `+'
Run Code Online (Sandbox Code Playgroud)

GS *_*ica 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
Run Code Online (Sandbox Code Playgroud)

然后你得到

> 'A' + 1
'B'

> 'B' - 'A' == 1
True
Run Code Online (Sandbox Code Playgroud)

但这是一个黑客,因为一个Char不是真正的数字.

特别注意如果您实际检查以下值,会发生什么'B' - 'A':

> 'B' - 'A'
'\SOH'
Run Code Online (Sandbox Code Playgroud)

即你得到的角色,1而不是实际上看到它Int.上面的等式检查有效,因为1转换为a Char,但是没有反向获得隐式转换.

我也省略了其他一些操作,Num所以你会得到编译器警告,有些操作不起作用.你可以沿着相同的线条添加它们,但它们的含义更少.