我正在尝试解决前一年的期中旧题,但在这个问题上遇到了很多麻烦。
使用列表理解,实现具有以下类型的函数:
collectSecond :: [[Int]] -> [Int]
使得 (collectSecond xs) 返回一个列表,其中包含 xs 的列表成员的第二个元素,但那些长度小于 2 的列表成员除外。例如:
collectSecond [[1,2,3], [4], [], [5,6]] ~> [2,6]
collectSecond [[1], [], [2]] ~> []
collectSecond [] ~> []
任何有关此问题的帮助将不胜感激。
最佳答案
您可以在列表理解中使用模式匹配来获取第二个元素,如下所示:
collectSecond xs = [x2 | x1:x2:rest <- xs]
此处 x2 与 xs 包含的每个列表的第二个元素(如果有)匹配。
Prelude> collectSecond [[1,2,3], [4], [], [5,6]]
[2,6]
如果没有第二个元素,则不会将任何元素添加到该子列表的列表中。例如,请参见上面示例中的 [4] 和 []。
关于包含 haskell 中列表成员的第二个元素的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15016277/