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?
cevap
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.
Ben en sevdiğim, çünkü esas olarak [Frankie Howerd] (http://en.m.wikipedia.org/wiki/Frankie_Howerd) hayal etmeyi sevdiğim için –
+1 fmap (en havalı) ve lambda (üzerinde çalıştığım herhangi bir kod tabanında olmasını isterdim!) – monk
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
Evet, böyle bir şey kullanmak istiyorum:
http://hackage.haskell.org/packages/archive/composition/latest/doc/html/Data-Composition.html
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.
http://conal.net/blog/posts/semantic-editor-combinators – luqui
[This] (http://stackoverflow.com/questions/9656797/variadic-compose-function) aradığınız şey olabilir . – is7s