我寫了這個小程式,我對它的行為有點困惑:
main = sequence $ iterate (printAdd =<<) (pure 0)
printAdd x = do
l <- getLine
let y = x read l
print y
pure y
我希望每次輸入一個新整數時它都會列印所有整數的總和。它或多或少地作業,但累加器反復重置為 0。此重置發生在第一個輸入之后、第三個輸入之后、第六個輸入之后,依此類推(即它總是比以前多一個輸入)。
為什么會發生這種情況?
我怎樣才能防止它發生?
uj5u.com熱心網友回復:
iterate為您提供逐漸變長的printAdd.
iterate回傳一個串列,其中每個元素都是通過將函式應用于前一個元素來給出的。在檔案中,您可以看到此插圖:
iterate f x == [x, f x, f (f x), ...]
在你的情況下,f = (printAdd =<<)和x = pure 0。因此,您的串列將如下所示:
iterate (printAdd =<<) (pure 0) =
[pure 0, (printAdd =<< pure 0), (printAdd =<< printAdd =<< pure 0), ...]
每個第 N 個元素都將是一個由 N 個printAdd呼叫鏈接在一起的鏈,第一個元素中包含一個零
然后sequence按順序執行所有這些元素。第零個什么都不做,第一個讀取一個數字并列印它,第二個讀取一個數字,列印,然后讀取另一個數字,然后列印總和,依此類推。每個第 N 個元素讀取 N 個數字并列印它們的滾動總和。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316839.html
標籤:哈斯克尔
