我試圖通過編寫自己的sum
函數來學習pipes
包,我很難過。我不想使用Pipes.Prelude
中的效用函數(因爲它具有sum
和fold
以及其他使它變得微不足道的函數),並且只使用Pipes.Tutorial
中描述的信息。本教程不討論Proxy
的構造函數,但如果我查看sum
和fold
的源代碼,它將使用這些構造函數,並且我想知道是否可以在不知道這些低級細節的情況下編寫函數sum
。如何編寫Haskell Pipes「sum」函數?
我遇到問題了,只要有可用的值,這個函數將如何繼續獲取值,然後以某種方式將該總和返回給用戶。我猜的類型是:
sum' :: Monad m => Consumer Int m Int
在我看來,這可能是工作,因爲直到沒有更多的此功能會消耗值,然後返回最後一筆。我會用這樣的:
mysum <- runEffect $ inputs >-> sum'
然而,在Pipes.Prelude
功能具有以下簽名:
sum :: (Monad m, Num a) => Producer a m() -> m a
所以我想這是我的第一個障礙。爲什麼sum
函數將Producer
作爲參數,而不是使用>->
進行連接?
FYI我結束了從danidiaz答案後執行以下操作:
sum' = go 0
where
go n p = next p >>= \x -> case x of
Left _ -> return n
Right (_, p') -> go (n + 1) p'
好了'sum'在管道中需要的東西,*產生*號,並在一元行動總結起來......這個想法頗爲相似你的想法如果你想 - 它也是這樣設計的包,你不應該在意細節,但使用'fold'和其他提供的原語;) – Carsten