我创建了一个数据类型,其中包含其他元素的列表
data Tarr = Tarr [Int] deriving (Show)
我想连接这些列表中的两个
Tarr [0,2,4,2] ++ Tarr [1]
但是我收到了错误
<interactive>:43:1:
Couldn't match expected type `[a0]' with actual type `Tarr'
如果有(++)(Concat说)的类型类,因为有(==)(Eq)我可以像
那样实现它class Concat a where
(+++) :: a -> a -> a
instance Concat Tarr where
(+++) (Tarr a) (Tarr b) = Tarr (a ++ b)
1)我该如何解决我的问题?
2)在类型类中没有定义(++)
的任何原因?
答案 0 :(得分:5)
++
函数仅适用于列表,但Monoid类型类中的<>
/ mappend
函数对其进行了概括。实际上,如果您将数据更改为新类型,则可以执行以下操作:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Data.Monoid
newtype Tarr = Tarr [Int] deriving (Show, Monoid)
答案 1 :(得分:1)
我不知道为什么(++)
没有被定义为类型类。但是,我会建议为此实现Monoid
接口。我认为Monoid
命名不佳,但mappend
和mconcat
似乎是众所周知的连接事物的函数。
instance Monoid Tarr where
mempty = Tarr []
mappend (Tarr l1) (Tarr l2) = Tarr (l1 ++ l2)
Tarr [1, 2, 3] `mappend` Tarr [4, 5, 6]