我正在選擇一個具體的任務來說明我在說什麼在haskell計算中「插入」進度記錄/跟蹤?
假設我想找到一個大數字的所有因素的總和,天真地 - 通過檢查下面的每個數字,如果它是一個因素,然後將它們加在一起。
與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
真的,這個增加是微不足道的。現在
,如果我是這樣做的教科書哈斯克爾我可以做
sum_of_factors :: Int -> Int
sum_of_factors n = foldl' (+) 0 factors
where
factors = filter ((== 0) . (mod n)) [1..n]
我遇到同樣的問題,因爲之前...爲大的數字,我只盯着一個空白屏幕一會兒。
但我無法弄清楚如何在Haskell代碼中注入相同類型的跟蹤/日誌記錄。我不確定,除了可能用顯式遞歸重新實現fold,以獲得與命令性不純代碼中相同的跟蹤模式/結果。
Haskell有一個教師可以做到這一點嗎?一個不需要重構所有東西?
謝謝
對於調試,可以使用'Debug.Trace'中的'traceShow'(或相關函數)。但是我也會對非調試版本感興趣。 – Stefan
注意:您的分部錯誤,'if(i%n == 0)'resp。 ''is_factor我=我'mod' n == 0''。另外,'(take n [1 ..])'應該是'[1 .. n]'。 –
過濾((== 3)。(\'mod \'n))[1..n]'總是對'n> 3'產生'3'嗎?在'[1..n]'上映射'(\'mod \'n)'只會產生[1,2,... n-1,0] '是的,就是'3'。 –