2013-06-02 17 views
13

Birden fazla argüman alan fonksiyonlarla fonksiyonel kompozisyon yapmanın mümkün olup olmadığını merak ediyordum. Bu sayıyı iki sayıya ekleyen bir işleve eşit olarak x ayarı yapmak için x 0 gibi bir şey yapabilmek istiyorum.Haskell'de çok değerli işlevler içeren fonksiyonel kompozisyon?

+4

http://conal.net/blog/posts/semantic-editor-combinators – luqui

+1

[This] (http://stackoverflow.com/questions/9656797/variadic-compose-function) aradığınız şey olabilir . – is7s

cevap

23

Bunu yapmanın birçok yolu vardır, ancak bunların hepsi biraz garip.

((+3).) . (*) 
≡ fmap (+3) . (*) 
≡ curry $ (+3) . uncurry (*) 
≡ \l r -> l*r + 3 

Ah, bu ... ne denir tahmin ayrıca kompakt bir tanımı olmasa imza oldu bekleyin

((.).(.)) (+3) (*) 

Ben lambda çözümü, en açık olmak olduğunu iddia ediyorum bunun yerine en iyisi. yardımcı olur ve genellikle bir (veya iki) -liner olarak sadece yerel olarak yapılır nedir

, özel Infix olarak bu kompozisyon tanımlamak: basitçe (+3) .: (*) yazmasına olanak tanır

(.:) :: (c->d) -> (a->b->c) -> a->b->d 
f .: i = \l r -> f $ i l r 

. Benzer (b->b->c) -> (a->b) -> a->a->c (için Infix iki bağımsız değişkenler sağ işlevi precompose) için

btw, a widely-used standard implementation vardır.

+1

Ben en sevdiğim, çünkü esas olarak [Frankie Howerd] (http://en.m.wikipedia.org/wiki/Frankie_Howerd) hayal etmeyi sevdiğim için –

+0

+1 fmap (en havalı) ve lambda (üzerinde çalıştığım herhangi bir kod tabanında olmasını isterdim!) – monk

+0

evet - tüm dürüstlükte lambdaya ya da daha iyi bir işleve isim verin: diğer çözümler entelektüel hoş ama daha fazla ya da daha az okunamayan (onları kolayca yeniden keşfedebilirsin ama okunamaz diyebilirim) - bunun gibi şeyler Haskell'e bu kadar çok iyi geliştiricinin Haskell'e bakmasını engelleyen "arcane abanoz-tower" etiketi veriyor – Carsten

2

Ayrıca Data.Aviary.Birds den B1 veya karatavuk bağdaştırıcının kullanabilirsiniz. Bence gerçek iş için bir lambda kullanırdım.

İlgili konular