5

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

我有:

data MyType = MyType [String]

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

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

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

4

3 回答 3

13

如果你不坚持打电话给接线员(++)

import Data.Monoid

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

然后你可以使用

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

这是一个别名mappend(我认为它已经是一个类型类成员,但它不是:/)。列出一个Monoid实例 where mappendis (++),这样就可以满足您的要求。该Monoid实例还为您提供

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

您可以使用它来连接MyTypes 的列表。

于 2012-11-27T23:32:15.000 回答
4

最简单的做法是

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
于 2012-11-27T23:32:04.767 回答
3

(++)运算符不属于任何类型类。您可以轻松检查:

$ 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)
于 2012-11-27T23:36:12.013 回答