Haskell更改列表的顺序

时间:2015-12-01 15:26:36

标签: haskell module

所以我有这个模块创建一个收藏列表,当我向列表中添加一些内容时,我希望它出现在列表的末尾。例如

let l1 = foldr add empty "bacaaced"

结果应该是{'d','e','c','a','b'}

注意:结果显示的原因是我实现了Show实例。

我的结果是{'b','a','c','e','d'}

我试图扭转输入字符串,但没有设法让它工作,有人可以帮我吗?

module MyModule
( ListFav(..)
, empty
, add
) where

data ListFav a = Elem (a,Bool) (ListFav a ) | Empty deriving (Show)

empty :: ListFav a
empty = Empty

inList :: Eq a => a -> ListFav a -> Bool
inList y (Elem (x,_) (xs))
   | y == x = True
   | xs == Empty = False
   | otherwise = inList y xs

add :: Eq a => a -> ListFav a -> ListFav a
add x Empty = Elem(x,False) Empty
add x xs 
   | inList x xs == True = xs   
   | otherwise = Elem (x,False) xs

3 个答案:

答案 0 :(得分:1)

因此,add检查列表中是否x,如果不是,则将其添加到列表的 start 。大概是你打算把它添加到列表的 end

为什么不这样做:

add :: Eq a => a -> ListFav a -> ListFav a
add x Empty = Elem (x, False) Empty
add x ys@(Elem (y,t) ys2) = if x == y then ys else Elem (y,t) (add x ys2)

即,查看第一个元素是否是您要添加的元素。如果是,我们就完成了。如果不是,则递归查看下一个项目。如果你没有找到该项目就到了最后,那就添加它。

答案 1 :(得分:0)

您在最后一行明确地将最后添加的结果放在列表顶部:Elem (x, False) xs

如果您只想打印结果,请按时间顺序排列"顺序,你可以自己实现Show并在那里反转列表。

此外,您可能会在结尾处相当经济地添加元素,因为无论如何您都要扫描整个列表中的重复项。您可以在同一时间进行扫描和重建。

答案 2 :(得分:0)

也许我错过了这一点,但你可以简单地用基本功能解决这个问题。试试reverse . nubnub . reverse