Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中的Char算法_Haskell_Char - Fatal编程技术网

Haskell中的Char算法

Haskell中的Char算法,haskell,char,Haskell,Char,在许多语言中,您可以为某个整数i编写'A'+i,以获得字母表中的一个字母。在哈斯克尔我怎么做?(还有反向操作,如let ch='B'in(ch-'A'))==1) 正如注释中指出的,您可以使用Data.Char中的函数在Int和Char之间进行转换。然而,这并不像你所要求的那样含蓄 如果您真的想要这样做,理论上可以创建一个Num实例,例如: import Data.Char (chr, ord) instance Num Char where c1 + c2 = chr (ord c1

在许多语言中,您可以为某个整数i编写
'A'+i
,以获得字母表中的一个字母。在哈斯克尔我怎么做?(还有反向操作,如
let ch='B'in(ch-'A'))==1


正如注释中指出的,您可以使用
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'
的值,会发生什么情况:

> 'B' - 'A'
'\SOH'
i、 e.您得到字符
1
,而不是实际将其视为
Int
。上面的相等性检查之所以有效,是因为
1
被转换为
Char
,但不会得到反向的隐式转换


我还省略了
Num
中的一些其他操作,因此您将收到编译器警告,而一些操作将无法工作。您可以沿着相同的行添加它们,但它们的意义更小。

ord
chr
来自Int和Char之间的转换。顺便说一句,
Char
是的一个实例。无需实现其他Num类函数,如
signum
?我在上一段提到过这一点(忍者在中编辑,所以你可能没有看到它本来)-理论上有些东西需要它们,但在
Char
上这样做更奇怪,所以为了解释的目的,我省略了它们。我最终使用了
chr
ord
,但我也可以接受给出的唯一答案。
> 'B' - 'A'
'\SOH'