所以我有这个模块创建一个收藏列表,当我向列表中添加一些内容时,我希望它出现在列表的末尾。例如
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
答案 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)