Kısmi uygulama ile ilgili iki önemli nokta vardır. Birincisi sözdizimsel / kolaylıktır - @jk'ın belirttiği gibi, bazı tanımların okunması ve yazılması kolaylaşır. (Bunun ne kadar harika olduğu hakkında daha fazla bilgi için Pointfree programlamaya göz atın !)
İkincisi, @telastyn'in belirttiği gibi, bir işlevler modeliyle ilgilidir ve sadece uygun değildir. Örneklerimi alacağım Haskell sürümünde, kısmi uygulama ile diğer dillere aşina olmadığım için, tüm işlevler tek bir argüman alır. Evet, hatta aşağıdaki gibi işlevler yapar:
(:) :: a -> [a] -> [a]
tek bir argüman almak; işlev türü yapıcısının ilişkilendirilebilirliği nedeniyle ->
, yukarıdakine eşdeğerdir:
(:) :: a -> ([a] -> [a])
bir işlev alan a
ve bir işlev döndüren bir işlevdir [a] -> [a]
.
Bu, aşağıdaki gibi işlevler yazmamızı sağlar:
($) :: (a -> b) -> a -> b
herhangi bir işlevi uygun türde bir bağımsız değişkene uygulayabilir . Çılgın olanlar bile:
f :: (t, t1) -> t -> t1 -> (t2 -> t3 -> (t, t1)) -> t2 -> t3 -> [(t, t1)]
f q r s t u v = q : (r, s) : [t u v]
f' :: () -> Char -> (t2 -> t3 -> ((), Char)) -> t2 -> t3 -> [((), Char)]
f' = f $ ((), 'a') -- <== works fine
Pekâlâ, bu tartışmalı bir örnekti. Ancak daha kullanışlı olanı, bu yöntemi içeren Uygulamalı tip sınıfını içerir:
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
Gördüğünüz gibi, tür biti $
alıp götürmekle aynıdır Applicative f
ve aslında bu sınıf bir bağlamda işlev uygulamasını açıklar. Yani normal fonksiyon uygulaması yerine:
ghci> map (+3) [1..5]
[4,5,6,7,8]
İşlevleri Uygulamalı bir bağlamda uygulayabiliriz; örneğin, bir şeyin mevcut veya eksik olabileceği Belki bağlamında:
ghci> Just map <*> Just (+3) <*> Just [1..5]
Just [4,5,6,7,8]
ghci> Just map <*> Nothing <*> Just [1..5]
Nothing
Şimdi gerçekten harika olan kısım, Uygulamalı tip sınıfının birden fazla argümanın işlevleri hakkında hiçbir şeyden bahsetmemesi - yine de onlarla başa çıkabilir, hatta 6 argümanın işlevleri gibi f
:
fA' :: Maybe (() -> Char -> (t2 -> t3 -> ((), Char)) -> t2 -> t3 -> [((), Char)])
fA' = Just f <*> Just ((), 'a')
Bildiğim kadarıyla, bazı genel uygulama kavramları olmadan genel formdaki Uygulamalı tip sınıfı mümkün olmayacaktır. Dil kısmi uygulama yoksun, sen, elbette - (orada herhangi bir programlama uzmanları için! Yanılıyorsam beni düzeltin lütfen) olabilir öyle, sadece aynı değil ... çeşit içinde inşa, ancak ? :)