y
'u tanıttığınızda çözümünüz farksız. Olması gereken
orijinal tip imzasını maçları
\x f y -> ((.) ((.) x) f) y :: (c -> d) -> (a -> b -> c) -> a -> b -> d
\x f y z -> ((.) ((.) x) f) y z :: (c -> d) -> (a -> b -> c) -> a -> b -> d
\x f y z -> ((.) x (f y)) z :: (c -> d) -> (a -> b -> c) -> a -> b -> d
-- Or alternately:
\x f y z -> (x . f y) z :: (c -> d) -> (a -> b -> c) -> a -> b -> d
\x f y z -> (x (f y z)) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
: (.) . (.) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
(Size :t expression
her adımı kontrol edebilirsiniz GHCi, genişleme yapmak çok kolaydır)
Düzenleme:
:
derin intution şudursadece biz
\f g x -> f (g x)
için kolaylaştırabilirsiniz Hangi
\f g -> \x -> f (g x)
olarak tanımlanan iki argüman bunu tedarik öldüğünde, curried var ve hala çözmek için başka argüman gerekiyor. 2 argümanla (.)
'u her kullandığınızda, bir argüman için "ihtiyaç" yaratırsınız.
(\f0 g0 x0 -> f0 (g0 x0)) (\f1 g1 x1 -> f1 (g1 x1)) (\f2 g2 x2 -> f2 (g2 x2))
Biz f0
ve g0
beta-azaltabilir (ama biz bir x0
yok:
(.) . (.)
elbette sadece
(.) (.) (.)
, o yüzden genişletmek edelim!):
\x0 -> (\f1 g1 x1 -> f1 (g1 x1)) ((\f2 g2 x2 -> f2 (g2 x2)) x0)
Yedek f1
için 2 ifadesi ...
\x0 -> \g1 x1 -> ((\f2 g2 x2 -> f2 (g2 x2)) x0) (g1 x1)
Şimdi "ters takla"! (
f2
üzerinde beta azaltma):
Bu ilginç bir adımdır -
x0
,
f2
için kullanılır - Bu, veri olabilecek
x
'un bir işlev olduğu anlamına gelir. Ekstra argüman için "ihtiyaç" -
Bu
(.) . (.)
sağlar şeydir.
\x0 -> \g1 x1 -> (\g2 x2 -> x0 (g2 x2)) (g1 x1)
Bu
... edelim (
g2
üzerine) bir son kez beta azaltmak, normal görünmeye başlıyor:
\x0 -> \g1 x1 -> (\x2 -> x0 ((g1 x1) x2))
Yani biz sadece
\x0 g1 x1 x2 -> x0 ((g1 x1) x2)
kalacaksın argümanların hala güzel olduğu yerler.
@lordlupine gözlüklerle bir boncuk gözlü düğme burunlu adam? –
@Will Ness Haklısınız ..: P –
@WillNess: Baykuş-With-Gözlük Combinator – amindfv