2012-10-23 102 views
3

我必须构建一个Snoc列表,反向的缺点。我已经做了添加一个元素,我不知道如何连接两个列表。这就是现在的情况:如何连接两个Snoc列表?

module Tsil where 

data Tsil a = Lin 
      | Snoc (Tsil a, a) 
      deriving (Eq, Ord, Show, Read) 


empty :: Tsil a 
empty = Lin 

infixr 2 |: 
(|:) :: a -> Tsil a -> Tsil a 
(|:) a t = Snoc (t, a) 

infixr 5 |++ 
(|++) :: Tsil a -> Tsil a -> Tsil a 
(|++) a Lin = a 
(|++) Lin a = a 
+4

...你确实意识到这完全与同一个列表同构,对吗?仅仅因为你颠倒了构造函数的名字和'Snoc'参数的顺序并没有使它成为不同的数据类型。如果这是一种练习,你确定你正确理解它吗?根据我的经验,具有“'snoc'”操作的数据类型通常支持对列表另一端的元素的有效访问 - 您的类型不会。 –

+1

为什么'Snoc'使用一个元组而不是'Snoc(Tsil a)a'? – pat

+0

@pat作业标签现已过时。 – HaskellElephant

回答

1

你的列表类型是一样的Haskell的,所以只是让一个Haskell列表,拼接,转换回。 Hooray在Haskell中的可重用性;-)

toList Lin = [] 
toList (Snoc (xs, x)) = x : toList xs 

toTsil [] = Lin 
toTsil (x:xs) = Snoc (toTsil xs, x) 

a (|++) b = toTsil $ toList a ++ toList b 
1
(|++) l (Snoc (t,x)) = Snoc (l |++ t,x)