Kendi sum
işlevimi yazarak pipes
paketini öğrenmeye çalışıyorum ve stumped alıyorum. Yardımcı fonksiyonlarını Pipes.Prelude
'dan (sum
ve fold
ve önemsiz kılan diğer işlevlere sahip olduğundan) kullanmak istemiyorum ve sadece bilgileri Pipes.Tutorial
'da açıklandığı gibi kullanın. Öğretici Proxy
yapıcıları hakkında konuşmuyor, ancak sum
ve fold
kaynağına baktığımda bu kurucuları kullanır ve bu düşük seviye ayrıntılarını bilmeden benim sum
fonksiyonumu yazmanın mümkün olup olmadığını merak ediyorum.Haskell Boruları "toplamı" fonksiyonu nasıl yazılır?
Bu işlevin, değerler mevcut olduğu sürece değerleri almaya devam etmesini nasıl sağlayabileceğiyle ilgili tereddütler yaşıyorum ve sonra bu şekilde kullanıcıya toplamı iade ediyorum. Ben türü olacağını tahmin: Bu fonksiyon artık kalmayıncaya kadar sonra, değerleri tüketmek nihai toplamı geri dönebilirler çünkü bana görünen
sum' :: Monad m => Consumer Int m Int
bu işe yarayabilir. Böyle kullanmak olacaktır:
mysum <- runEffect $ inputs >-> sum'
Ancak Pipes.Prelude
işlevi yerine aşağıdaki imzası vardır:
sum :: (Monad m, Num a) => Producer a m() -> m a
Yani bu benim ilk engel sanırım.
sum
işlevi, bağlanmak için
>->
kullanmak yerine, bir
Producer
numaralı argümanı neden alır?
Bilginize ben danidiaz gelen cevap sonrasında aşağıdaki ile sona erdi:
sum' = go 0
where
go n p = next p >>= \x -> case x of
Left _ -> return n
Right (_, p') -> go (n + 1) p'
'borularda sum' * * numaralar üreten ve Birli eylem bunları özetliyor şey alır ... düşüncesi oldukça benzer eğer düşünürseniz - aynı zamanda paket detaylara dikkat etmeyecek şekilde tasarlanmalıdır, ancak 'fold' ve sağlanan ilkellerin geri kalanını kullanmalısınız;) – Carsten