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

kal*_*ida -1 haskell

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

我的尝试:

instance Num Char where
 (+) (a) (b) = [a] ++ [b]
Run Code Online (Sandbox Code Playgroud)

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

如前所述,我的预期输出是将两个字符叠加而成的字符列表。

che*_*ner 8

Rather than overload (+) with non-numeric semantics, define your own character "addition" operator.

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]
Run Code Online (Sandbox Code Playgroud)

Then 'a' ^+ 'b' == "ab". (^+) will work for creating a two-element list of any type, not just Char.

> 'a' ^+ 'b'
"ab"
> 3 ^+ 4
[3,4]
> [1,2] ^+ [4,5]
[[1,2],[4,5]]
Run Code Online (Sandbox Code Playgroud)

  • 拿出大炮吧?on,pure,...您几乎没有错过将(++)泛化为(<>)使其尽可能难以理解的可能性。看来,Haskell的简单程度让我们失去了联系。`a ^ + b = [a,b]`(无论如何赞成)。 (4认同)

ama*_*loy 6

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

  • 编译器不会抱怨,但是任何阅读程序的人都会抱怨。 (4认同)