当前位置:  开发笔记 > 编程语言 > 正文

Haskell从列表中删除1个元素的所有可能方法

如何解决《Haskell从列表中删除1个元素的所有可能方法》经验,为你挑选了1个好方法。

这是我到目前为止写的,但我有点失落:

removeone :: [a] -> [[a]]
removeone [] = []
removeone (a:as) = [as] -- I'm lost here

这是我正在寻找的那种输出:

removeone [1,2,3] = [[2,3],[1,3],[1,2]]
removeone [1,2]   = [[1],[2]]

解决这个问题的最佳方法是什么?在Java中,我只是循环这个,每次产生一个新的列表,我将附加到一个预先存在的列表.我很想把它翻译成Haskell.



1> chepner..:

让我们看一个稍长的例子,弄清楚如何分解它:

> removeone [1,2,3,4]
[[2,3,4],[1,3,4],[1,2,4],[1,2,3]]

正如您已经猜到的那样,您只需as某些列表的前面放置(从输入中删除第一个元素的结果),但是那个列表是什么?

removeone (a:as) = as : ...

仔细观察,你可以看到它们a == 1位于每个方面的前面.让我们考虑一下如何构建它:

[[1,3,4],[1,2,4],[1,2,3]] == [1:[3,4],1:[2,4],1:[2,3]]
                          == map (1:) [[3,4],[2,4],[2,3]]

第二个参数应该看起来很熟悉:这是你应该期待的结果removeone [2,3,4].就像那样,你有你的递归案例:

removeone (a:as) = as : map (a:) (removeone as)

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有