Haskell 更改列表的顺序

Haskell change the order of a list

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

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

因此,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)

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

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

如果您只想打印 "chronological" 顺序的结果,您可以自己实现Show 并在那里反转列表。

此外,您可能会非常经济地在末尾添加您的元素,因为无论如何您都会扫描整个列表以查找重复项。您可以同时进行扫描和重建。

也许我忽略了重点,但您可以使用基本函数简单地解决这个问题。尝试 reverse . nubnub . reverse.