2012-11-27 50 views
5

是否可以在Haskell中爲自定義數據類型定義我自己的++運算符?haskell中的自定義concat(++)運算符

我:

data MyType = MyType [String] 

,我想定義自己的連接符爲:

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

我似乎無法找到任何地方的實例類的名稱。

回答

13

如果你不上調用操作(++)堅持,

import Data.Monoid 

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

然後你可以使用

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

這是一個mappend的別名(我認爲它已經是一個類型成員,但它不是:/)。列出hava一個Monoid其中mappend(++)的實例,這樣就可以做你想做的事情。該Monoid實例也給你

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

,您可以使用來連接的MyType的List。

+0

中增加了這個,這是專業和業餘時間程序員之間的區別 - 知道有'Monoid'類型類。 – epsilonhalbe

+0

是否將<>運算符定義爲與列表的++運算符相同? –

+0

@韋斯利坦西是的,但我剛剛檢查,似乎還沒有發佈GHC版本中的類成員,所以我必須稍微糾正我的解決方案。 –

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 
+0

這個解決方案似乎給我帶來了所有其他++操作不明確的問題。 –

+0

我認爲你必須爲列表添加一個實例 - 我在編輯 – epsilonhalbe

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)