我必须构造一个Snoc列表,与Cons相反。我已经完成了向前添加一个元素的操作,我不知道如何串联两个列表。现在就是这种情况:

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

最佳答案

您的列表类型与Haskell的列表类型相同,因此只需将其设为Haskell列表,然后进行串联,转换回即可。对于在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

10-07 13:07