【发布时间】:2018-12-10 22:03:35
【问题描述】:
我想在业余时间通过解决 ProjectEuler 问题来学习 Haskell,当我遇到问题 5 时,我最终尝试按列表的第一个元素对列表进行分组。以下是我想要的行为示例:
输入:
[[2], [3], [2, 2], [5], [7], [3, 3]]`
输出:
[[[2], [2, 2]], [[3], [3, 3]], [[5]], [[7]]]
为此,我编写了以下代码
import Data.List (groupBy)
factors = [[2], [3], [2, 2], [5], [7], [3, 3]]
groupedFactors =
let comp x y = (head x) == (head y)
in groupBy comp factors
但是,上面代码的结果是下面的列表
[[[2]],[[3]],[[2,2]],[[5]],[[7]],[[3,3]]]
我尝试调试这个,所以我在 GHCI 中编写了以下代码:
factors = [[2], [3], [2, 2], [5], [7], [3, 3]]
comp x y = (head x) == (head y)
comp (factors!!0) (factors!!2)
产生True,比较第四个元素产生False,正如预期的那样。
最后我想说的是,我当然可以用另一种方法解决手头的问题,但我很想知道这里发生了什么。对我来说,理解为什么会出现这种行为比如何解决它更重要(尽管我也不会对解决方案说不)。
【问题讨论】:
-
请注意,Project Euler 的目的是鼓励人们思考和学习,因此发布解决方案或工作代码会使这个过程变得毫无用处。
-
作为提示,
groupBy函数将元素分组在一行中。所以groupBy (==) [1,1, 2,3]返回[[1,1], [2], [3]]而groupBy (==) [1, 2, 1,3]返回[[1], [2], [1], [3]]