我正在选择一个特定的任务来说明我在说什么
假设我天真地想找到一个大数的所有因子的总和——通过检查它下面的每个数字是否是一个因子,然后将它们加在一起。
在 IO 和纯计算之间没有分离的命令式编程语言中,您可能会做这样的事情
def sum_of_factors(n):
sum = 0
for i between 1 and n:
if (n % i == 0):
sum += i
return sum
但是,如果我n
很大,我最终会在计算完成之前长时间盯着一个空屏幕。所以我添加了一些日志记录——
def sum_of_factors(n):
sum = 0
for i between 1 and n:
if (i % 1000 == 0):
print "checking $i..."
if (n % i == 0):
print "found factor $i"
sum += 1
return sum
真的,这个添加是微不足道的。
现在,如果我要在教科书haskell中这样做,我可能会这样做
sum_of_factors :: Int -> Int
sum_of_factors n = foldl' (+) 0 factors
where
factors = filter ((== 0) . (mod n)) [1..n]
我遇到了和以前一样的问题......对于大量数字,我只是盯着空白屏幕一会儿。
但我不知道如何在 Haskell 代码中注入相同类型的跟踪/日志记录。我不确定,除了可能用显式递归重新实现折叠之外,以获得与命令式不纯代码中相同的跟踪模式/结果。
Haskell 中是否有教员可以做到这一点?一个不需要重构所有东西的?
谢谢