5

Şimdi s (s k) tipi imzasını anlıyorum:yapın: s (sk)

s (s k) :: ((t1 -> t2) -> t1) -> (t1 -> t2) -> t1 

Ve Haskell WinGHCi aracında hata olmadan çalışabilir örnekler oluşturabilirsiniz:

Örnek:

s (s k) (\g -> 2) (\x -> 3) 

döner 2.

Örnek:

s (s k) (\g -> g 3) successor 

döner 4. successor böylece olarak tanımlanır

:

successor = (\x -> x + 1) 

Bununla birlikte, hala s (s k) ne için sezgisel bir his yok.

Kombinatör s (s k) her iki işlevi f ve g alır. s (s k)f ve g ile ne yapar? Bana Ne s (s k) lütfen yapar üzerine büyük resmi verir misiniz?

+1

S (S K) 'için tanımı' eksik. Bu http://stackoverflow.com/questions/9592191/the-type-signature-of-a-combinator-does-not-match-the-type-signature-of- içinde k' aynı 's' ve' mi onun-equi? –

+0

Btw, sezgisel nedir? Http://en.wikipedia.org/wiki/Ouroboros'u sezgisel buldunuz mu? Bir yılanın kendini yediğini ve yok olduğunu hayal edebiliyor musun? Ya da kendini kendi başına üreten bir robot mu? Kendi başına hareket eden bir şey hakkında daha iyi bir şeye ihtiyacın var. –

cevap

11

Pekala, neyi S (S K) yollarla bakalım. Bunları tanımlarını kullanmak için gidiyorum: Gördüğünüz gibi

S = \x y z -> x z (y z) 
K = \x y -> x 

S (S K) = (\x y z -> x z (y z)) ((\x y z -> x z (y z)) (\a b -> a)) -- rename bound variables in K 
     = (\x y z -> x z (y z)) (\y z -> (\a b -> a) z (y z)) -- apply S to K 
     = (\x y z -> x z (y z)) (\y z -> (\b -> z) (y z)) -- apply K to z 
     = (\x y z -> x z (y z)) (\y z -> z) -- apply (\_ -> z) to (y z) 
     = (\x y z -> x z (y z)) (\a b -> b) -- rename bound variables 
     = (\y z -> (\a b -> b) z (y z)) -- apply S to (\a b -> b) 
     = (\y z -> (\b -> b) (y z)) -- apply (\a b -> b) to z 
     = (\y z -> y z) -- apply id to (y z) 

, sadece ($) daha spesifik tip var.

+2

başka bir yolu, bu görmek: tip 'dır ((t1 -> t2) -> t1) -> (t1 -> t2) -> t1'. Parantez ekleyerek, ((t1 -> t2) -> t1) -> ((t1 -> t2) -> t1) 'yi alırız. 'Α' türünün '(t1 -> t2) -> t1' için durmasını sağlar, bu sadece' α -> α' şeklindedir ve parametrik olarak 's (sk)' daha özel bir kimlik işlevidir. yazın. (Ve tabii ki, ($) :: (a -> b) -> a -> b' * * sadece daha spesifik bir türe sahip olan kimlik fonksiyonu.) –

+0

Gerçekten de, -> \ z -> yz', biz \ "y>" yı alırız. – Vitus

+1

Kombinatörlerde, S K y z = K z (y z) = z. Daha sonra S (S K) yz = SKz (yz) = K (yz) (z (yz)) = y z. – rickythesk8r