是否可以在Haskell中爲自定義數據類型定義我自己的++
運算符?haskell中的自定義concat(++)運算符
我:
data MyType = MyType [String]
,我想定義自己的連接符爲:
instance ? MyType where
(MyType x) ++ (MyType y) = MyType (x ++ y)
我似乎無法找到任何地方的實例類的名稱。
是否可以在Haskell中爲自定義數據類型定義我自己的++
運算符?haskell中的自定義concat(++)運算符
我:
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
的別名(我認爲它已經是一個類型成員,但它不是:/)。列出hava一個Monoid
其中mappend
是(++)
的實例,這樣就可以做你想做的事情。該Monoid
實例也給你
mconcat :: Monoid m => [m] -> m
,您可以使用來連接的MyType
的List。
最簡單的將是做
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
這個解決方案似乎給我帶來了所有其他++操作不明確的問題。 –
我認爲你必須爲列表添加一個實例 - 我在編輯 – epsilonhalbe
(++)
運算符不屬於任何類型的類。您可以輕鬆地檢查:
$ 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)
中增加了這個,這是專業和業餘時間程序員之間的區別 - 知道有'Monoid'類型類。 – epsilonhalbe
是否將<>運算符定義爲與列表的++運算符相同? –
@韋斯利坦西是的,但我剛剛檢查,似乎還沒有發佈GHC版本中的類成員,所以我必須稍微糾正我的解決方案。 –