From the chapter on Functors in Learn You a Haskell for Great Good, Lipovača devletler: Biz (+) <$> (+3) <*> (*100)
yaptığımızda
", biz
+
kullanacağı bir işlev yapıyoruz(+3)
ve(*100)
ve sonuçları bu dönün. gerçek bir örnek üzerinde göstermek için biz(+) <$> (+3) <*> (*100) $ 5
yaptığımız zaman,5
ilk8
ve500
sonuçlanan(+3)
ve(*100)
uygulanan gördü. Daha sonra,+
8
ve500
, res ile çağrılan508
'da son nokta. " Ben funktor üzerinde uygulamalı bu tanımı göz önüne alındığında, fonksiyonu kendim değerlendirmek için deneyin
Bununla birlikte, ((->) r):
instance Applicative ((->) r) where
pure x = (\_ -> x)
f <*> g = \x -> f x (g x)
yukarıda ifade olarak değerlendirilmesini şöyledir:
(\x -> (3 + x) (100 * x)) $ 5
Ama biz aslında (tek lambda olarak iki kısmen uygulanan ikili işlevlerini oluşturabilirsiniz nasıl görmüyorum, GHCi bu bağlamaya çalışırken sonsuz tip hata atar bir değişken).
(<$>) :: Functor f => (a -> b) -> f a -> f b
veya daha spesifik biz olarak kaldırma bakabilirsiniz: biz <$>
tip tanımına bakarsak Ayrıca, çalışma yorumlamaya, biz olsun düşünülürse
(<$>) :: Functor f => (a -> b) -> (f a -> f b)
Bu durumda bizim functor ((->) r), ben bu dönüşüm önceki değerlendirme (5
doğru çağrıştırma uygulaması yerine, ilk önce sol birliği olduğunu varsayarak) gerçekleştiği olduğunu söyleyebiliriz:
(\x -> a + b)
burada a
= (+ 3)
ve = (* 100)
b
. Bu, iade edilmesi gereken işlevdir. Ancak, bunun son (kaba) bir form olduğunu varsayarak düzeliyorum mu? 508.
verir
(\x -> (3 + x) + (100 * x)) $ 5
... altında gorey detaylar için tamamen doğru değildir ben ifadesi nasıl çalıştığını açısından daha anlaşılır Lipovača açıklamasını bulmak, ama benim bağırsak söylüyor Haskell derleyici kukuleta. Önce (+) 'nın fmap'inin, paylaşılan girdiyi alan fonksiyonların kısmen uygulandığı iki functor ile sonuçlanan bir fonksiyona yol açtığını düşünmemiz daha kolay olur ve sonra ona bir değer uyguladık. Bunu tembel değerlendirme nedeniyle yapabiliriz. Bu yanlış mı?
"de yukarıda ifade değerlendirme okumak:
ve GHCi içinde
'(\ x -> (3 + x) (100 * x)) 5 $ ". İpucu: değerlendirmeniz '((+) <$>)' türünde bir hata eksik. – duplodeEvet, bu yüzden devam ediyorum ve ikinci yarısına dahil ediyorum. – RJS
Oops - boşver, sorunun orta kısmını yanlış okumuştum. – duplode