簡體   English   中英

Haskell 迭代 (f:: IO a -> IO a)

[英]Haskell iterate (f :: IO a -> IO a)

我寫了這個小程序,我對它的行為有點困惑:

main = sequence $ iterate (printAdd =<<) (pure 0)

printAdd x = do
  l <- getLine
  let y = x + read l
  print y
  pure  y

每次我輸入一個新整數時,我都希望它打印出所有整數的總和。 它或多或少確實起作用,但累加器反復重置為 0。 此重置發生在第一個輸入之后、第三個輸入之后、第六個輸入之后等等(即它總是比以前多對一個輸入起作用)。

為什么會這樣?

我怎樣才能防止它發生?

iterate為您提供一個逐漸變長的printAdd鏈列表。


iterate返回一個列表,其中每個元素都是通過將 function 應用於前一個元素而給出的。 文檔中你可以看到這個插圖:

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 個數字並打印它們的滾動總和。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM