は、私は自分のsum
機能を書き込むことによってpipes
パッケージを学ぶしようとしていると私は困惑して取得しています。私は(それはそれは些細な作りsum
とfold
やその他の機能を持っているので)Pipes.Prelude
からユーティリティ関数を使用しないのが好きとだけPipes.Tutorial
に記載された情報を使用すると思います。チュートリアルでは、Proxy
のコンストラクタについて話しませんが、私はsum
とfold
のソースで見れば、それは、これらのコンストラクタを使用して、私はこれらの低レベルの詳細の知識がなくても、私のsum
機能を書き込むことができるだろうか。Haskell Pipes "sum"関数の記述方法は?
私は、この機能は限り利用可能な値があるような値で撮影を続行することができるだろうかとの用語に来てトラブルを抱えて、その後、何らかの形でユーザーにその合計を返しています。私はタイプのようになり推測:
sum' :: Monad m => Consumer Int m Int
それはもうあるまで、この関数は、最終的な合計を返し、その後、値を消費しない可能性があるため、これは仕事ができる私に表示されます。しかし、Pipes.Prelude
内の関数ではなく、次のシグネチャがあり
mysum <- runEffect $ inputs >-> sum'
:
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