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 . nub
或 nub . reverse
.
所以我有这个模块可以创建收藏夹列表,当我向列表添加内容时,我希望它出现在列表的末尾。例如
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 . nub
或 nub . reverse
.