我目前从事 Project Euler 的工作是为了好玩,并使用 Haskell 进行练习。但是,我遇到了一个问题,我似乎无法生成一个更小的示例,所以这里是代码(对于项目 euler 232):
buildNum (x, y) = multNum x y 1 []
where multNum num mul exp s = if (num > 10 ^ 100) then s else multNum nNum mul nexp ns
where next = (num * mul) `div` exp
ns = num:s
top = next `mod` 10
nexp = exp * 10
nNum = num + nexp * top
sumBuild (x, y) = (head (buildNum (x, y))) * length (buildNum (x, y))
请忽略这里的不良风格:)
如果我在这里加载并运行 sumBuild(7, 5) ,我会得到一个异常:
*** Exception: Prelude.head: empty list
但是,如果我将 sumBuild 更改为:
sumBuild (x, y) = head (buildNum (x, y))
或者
sumBuild (x, y) = length (buildNum (x, y))
然后它运行良好。
这对我来说真的很困惑,因为没有副作用,而且两次运行会产生不同的结果(至少看起来是这样)。这里有什么问题?
如果有人可以将此程序编辑为最小的工作示例,那么我真的很感激!
谢谢你的帮助!