我希望将两个字符之间的加法定义为隐含性,但是不确定如何正确实现。
我的尝试:
instance Num Char where
(+) (a) (b) = [a] ++ [b]
但是我得到的错误是返回类型不是预期的类型。
我的预期输出如前所述,是一个通过混合两个字符形成的字符列表。
答案 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。