bana e yeniden yazılmalı System-F benzeri bir notasyon kullanarak örnekleme yapın; Aşağıda, \\
, tip soyutlama (büyük lambda) ve sözlük soyutlamayı temsil eder. Ayrıca, @
tipi/sözlük uygulaması anlamına gelir.
İşte
(.) :: forall a b c . (b -> a) -> (c -> b) -> (c -> a)
(değil kalbin zayıf, dikkat) açıklamalı kod::
Bunu yapmadan önce, (.)
tipini hatırlamak ben davrandı Üstü (
fComp :: F b c -> F a b -> F a c
fComp (f :: forall f1. Functor f1 => f1 b -> f1 c)
(f':: forall f2. Functor f2 => f2 a -> f2 b)
= \\ ff :: (* -> *) ->
\\ ffD :: Functor ff ->
((.) @ (ff c) @ (ff b) @ (ff a)) -- instantiated composition
(f @ ff @ ffD) -- first argument of (.)
(f' @ ff @ ffD) -- second argument of (.)
a
, b
c
, tip-düzey lambdalardan kaçınmak için tip sabitlerdir.)
önemli parçaları:
f
ve f'
belirli türleri de kullanılmaktadır. Bu, (.)
'a beslenmeden önce tür düzeyinde argümanlara uygulanmaktadır.
(.)
Gördüğünüz gibi
f
ait politipine ve
f'
olmayan tipler (ff c
, vs) için tür düzeyinde uygulanıyor, orijinal kod uzak önemsiz olmaktan uzaktır. Tür çıkarımı, gerekli tip düzeyinde lambdaları ve uygulamaları ekleyebilir. Bunları ekledikten sonra, artık fComp
sözleşmesini imzalayamayız. Pointfree değişkeninde, sonuç yazımının anlamlı durumdan daha fazlasını yapması gerekecektir. fComp
'un ilk argümanı F a b
türünde iken, (.)
'un ilk argümanı, F a b = forall g . ...
için birleşmeyen x -> y
formunda olmalıdır. Nitekim başarıyla aşağıda yazarak girişimini çözmek için hiçbir yolu yoktur:
fComp :: F b c -> F a b -> F a c
fComp
= \\ ff :: (* -> *) ->
\\ ffD :: Functor ff ->
((.) @ ???a @ ???b @ ???c)
Üstü hiçbir ???a
var ... o istediği şeye yol açabilir.
tek olasılık F x y
tiplerinde gizli forall
-quantified değişkenleri örneğini, ama biz noktası gerektiğini yapmak olacaktır. Derleyici bu kodu sizin için genişletebilir, böylece noktalar görünür ve böylece teorik olarak konuşulabilir, ancak pratikte olmaz.
(Ayrıca, eta genişletme her zaman Haskell'de geçerli değildir: örn. seq (undefined::()->()) 3
döngüleri, seq (\x->(undefined::()->()) x) 3
3
döndürür).
Bunu tam olarak anlamak için hangi kitapları okumam gerekir? –
@ErikAllik: Kesinlikle emin değilim. Ben giderken eşyaları topluyorum. [Tyk Haskell in Haskell] (http://web.cecs.pdx.edu/~mpj/thih/thih.pdf) makalesine göz atabilir ve ayrıca * Türler ve Programlama Dilleri'nde * yer alabilir. TAPL) bir ton diğer malzeme ile birlikte. –