haskell中的自定义concat(++)运算符

Wes*_*sey 5 haskell operators

是否可以++在Haskell中为自定义数据类型定义自己的运算符?

我有:

data MyType = MyType [String]
Run Code Online (Sandbox Code Playgroud)

我想将我自己的连接运算符定义为:

instance ? MyType where
    (MyType x) ++ (MyType y) = MyType (x ++ y)
Run Code Online (Sandbox Code Playgroud)

我似乎无法在任何地方找到实例类的名称.

Dan*_*her 13

如果您不坚持致电运营商(++),

import Data.Monoid

instance Monoid MyType where
    (MyType x) `mappend` (MyType y) = MyType (x ++ y)
    mempty = MyType []
Run Code Online (Sandbox Code Playgroud)

然后你可以使用

(<>) :: Monoid m => m -> m -> m
Run Code Online (Sandbox Code Playgroud)

这是别名mappend(我以为它已经是类型类成员,但它不是:/).列出哈瓦一个Monoid实例,其中mappend(++),这样会对你的愿望.该Monoid实例也给了你

mconcat :: Monoid m => [m] -> m
Run Code Online (Sandbox Code Playgroud)

你可以用它来连接一个MyTypes 列表.

  • 值得注意的是,如果你有一个关联的`(<>)`但没有'mempty`,你的类型可能是[semigroup](http://hackage.haskell.org/packages/archive/semigroups/latest/doc/ HTML /数据Semigroup.html).不幸的是,`Semigroup`目前不是`Monoid`的超类. (2认同)