Прежде всего, facs
- это функция идентификации:
facs (x,y) = (x,y)
y
связан в сопоставлении с образцом с левой стороны, в то время как вы, вероятно, предполагали, что это будет y
из списка. Имена переменных, связанные в понимании списка, являются локальными по отношению к этому пониманию и не могут использоваться в другом объеме, например, в предложении where
.
Кроме того, y
в понимании списка вычисляется только из последнего показателя факторов:
y <- [0..(snd $ last $ primePowerFactors n)]
Для каждого фактора следует учитывать его собственный показатель, а не только показатель последнего.
Более фундаментальная проблема заключается в том, что тип возвращаемого значения функции factors
не соответствует ее намерению:
*Euler> :t factors
factors :: Integer -> [(Integer, Int)]
Возвращает список степеней простых факторов, в то время как должен генерировать список этих конструкций, например:
[
[(2,0), (7,0)],
[(2,1), (7,0)],
[(2,2), (7,0)],
[(2,0), (7,1)],
[(2,1), (7,1)],
...
]
Необходима простая факторизация всех возможных факторов, но функция, кажется, возвращает только одну простую факторизацию.