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



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

我有:

data MyType = MyType [String]

我想把我自己的级联运算符定义为:

instance ? MyType where
(MyType x) ++ (MyType y) = MyType (x ++ y)

我似乎在任何地方都找不到实例类的名称。

如果您不坚持呼叫操作员(++)

import Data.Monoid
instance Monoid MyType where
(MyType x) `mappend` (MyType y) = MyType (x ++ y)
mempty = MyType []

然后你可以使用

(<>) :: Monoid m => m -> m -> m

它是mappend的别名(我以为它已经是一个类型类成员,但它不是:/)。列出有一个Monoid实例,其中mappend(++),所以可以随心所欲。Monoid实例还为您提供

mconcat :: Monoid m => [m] -> m

可用于连接MyTypes的列表。

最简单的方法是进行

import Prelude hiding ((++))
import qualified Prelude as P
data MyType = MyType [String]
class PlusAble a where
infixr 5 ++
(++) :: a -> a -> a
instance PlusAble MyType where
(MyType x) ++ (MyType y) = MyType (x P.++ y)
-- EDIT:
instance PlusAble [a] where
x ++ y = x P.++ y

(++)运算符不属于任何类型类。你可以很容易地检查这个:

$ ghci
Prelude> :info (++)
(++) :: [a] -> [a] -> [a]   -- Defined in `GHC.Base'
infixr 5 ++

所以,它只是GHC.Base模块中定义的一个简单函数。你可以隐藏它并定义自己的

import Prelude hiding ((++))
import qualified Prelude -- to get hidden (++) as Prelude.(++)
-- your brand new (++)
infixr 5 ++
(MyType x) ++ (MyType y) = MyType (x Prelude.++ y)

最新更新