Haskell数据类型和列表

时间:2013-12-28 21:29:26

标签: haskell

我创建了一个数据类型,其中包含其他元素的列表

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)在类型类中没有定义(++)的任何原因?

2 个答案:

答案 0 :(得分:5)

++函数仅适用于列表,但Monoid类型类中的<> / mappend函数对其进行了概括。实际上,如果您将数据更改为新类型,则可以执行以下操作:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Data.Monoid

newtype Tarr = Tarr [Int] deriving (Show, Monoid)

答案 1 :(得分:1)

我不知道为什么(++)没有被定义为类型类。但是,我会建议为此实现Monoid接口。我认为Monoid命名不佳,但mappendmconcat似乎是众所周知的连接事物的函数。

instance Monoid Tarr where
    mempty = Tarr []
    mappend (Tarr l1) (Tarr l2) = Tarr (l1 ++ l2)

Tarr [1, 2, 3] `mappend` Tarr [4, 5, 6]