Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 我正在尝试删除列表列表中每个列表的最后一项_List_Haskell_Filter - Fatal编程技术网

List 我正在尝试删除列表列表中每个列表的最后一项

List 我正在尝试删除列表列表中每个列表的最后一项,list,haskell,filter,List,Haskell,Filter,我有一个数据结构,它是一个列表列表。我想删除每个列表的最后一项,最好使用过滤器。我该怎么做呢?下面是一个示例,演示如何做: map (\xs->if null xs then xs else init xs) [[], [1..3], [4..6]] 结果是: [[],[1,2],[4,5]] 请注意,在删除列表的最后一项之前,需要检查列表中的每个列表是否为空,因为init不能应用于空列表。将f映射到列表上,其中f是删除列表最后一个元素的函数。这通常不是筛选器的用例:这是一个“映射”(

我有一个数据结构,它是一个列表列表。我想删除每个列表的最后一项,最好使用过滤器。我该怎么做呢?

下面是一个示例,演示如何做:

map (\xs->if null xs then xs else init xs) [[], [1..3], [4..6]]
结果是:

[[],[1,2],[4,5]]

请注意,在删除列表的最后一项之前,需要检查列表中的每个列表是否为空,因为
init
不能应用于空列表。

f
映射到列表上,其中
f
是删除列表最后一个元素的函数。这通常不是筛选器的用例:这是一个“映射”(因为您在列表的每个项目上应用了一个函数)。我认为与其先解决列表问题,不如先尝试删除单个列表的最后一项。如果子列表为空,该怎么办?从列表末尾删除给定数量的元素,自动处理空列表的常用习惯用法是
zipWith const xs(drop n xs)
n
这里是1),例如
map(\xs->zipWith const xs(drop 1xs))
。这也可以像
map(zipWith const drop 1)
那样方便地写出来,但我很感激不是每个人都觉得
应用程序读起来很愉快。@JonPurdy我不确定哪种方式更好,两者都是O(n)并且能够处理无限列表。我选择了
if null xs…
版本,因为它对于Haskell的新手来说很容易理解。是的,我认为你的方法是对这个特定问题的更合适的答案。我只想提一下另一个选择,因为它是一个习惯用法,一开始不一定直观,但可能有人会遇到呃,是的,你是对的,你在评论中的补充解释很有用,所以我投了赞成票。实际上,你的方法更倾向于删除列表末尾任意数量的元素,但我回答中的方法不适合从列表末尾删除超过1个元素。