将加法定义为haskell中Num的实例

时间:2019-03-11 20:01:21

标签: haskell

我希望将两个字符之间的加法定义为隐含性,但是不确定如何正确实现。

我的尝试:

instance Num Char where
 (+) (a) (b) = [a] ++ [b]

但是我得到的错误是返回类型不是预期的类型。

我的预期输出如前所述,是一个通过混合两个字符形成的字符列表。

2 个答案:

答案 0 :(得分:8)

定义而不是使用非数字语义重载(+),而是定义自己的字符“ addition”运算符。

import Data.Function

-- The ^ is meant to suggest lifting values into a list.
(^+) :: a -> a -> [a]
x ^+ y = (++) `on` pure
-- Or more simply,
-- x ^+ y = [x, y]

然后'a' ^+ 'b' == "ab"(^+)将用于创建 any 类型的两个元素列表,而不仅仅是Char

> 'a' ^+ 'b'
"ab"
> 3 ^+ 4
[3,4]
> [1,2] ^+ [4,5]
[[1,2],[4,5]]

答案 1 :(得分:6)

这是不可能的。 (+)中的Num函数的类型为a -> a -> a,因此返回类型必须与参数类型相同。您不能添加两个Char并因此收到String。一般来说,除了对数字进行算术运算外,您不应该对其他事情实现Num。