5

bây giờ tôi hiểu kiểu chữ ký của s (s k):gì combinator này làm: s (sk)

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

Và tôi có thể tạo ra những ví dụ mà làm việc mà không có lỗi trong công cụ Haskell WinGHCi:

Ví dụ:

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

trả về 2.

Ví dụ:

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

lợi nhuận 4.

nơi successor được định nghĩa như vậy:

successor = (\x -> x + 1) 

Tuy nhiên, tôi vẫn không có một cảm giác trực quan cho những gì s (s k) làm.

Bộ tổ hợp s (s k) có hai chức năng fg. s (s k) làm gì với fg? Bạn có cho tôi bức tranh lớn về những gì s (s k) không?

+1

Việc hủy bỏ 'S (S K)' bị thiếu. Đây có phải là 's' và' k' giống nhau trong http://stackoverflow.com/questions/9592191/the-type-signature-of-a-combinator-does-not-match-the-type-signature-of- equi của nó? –

+0

Btw, cái gì là trực quan? Bạn có tìm thấy http://en.wikipedia.org/wiki/Ouroboros trực quan không? Bạn có thể tưởng tượng một con rắn ăn và biến mất không? Hay một robot tự xây dựng chính nó? Bạn cần cảm giác tốt hơn về một cái gì đó hành động trên chính nó. –

Trả lời

11

Được rồi, hãy xem ý nghĩa của số S (S K). Tôi sẽ sử dụng các định nghĩa sau:

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) 

Như bạn có thể thấy, nó chỉ là ($) với loại cụ thể hơn.

+2

Một cách khác để thấy điều này: loại là '((t1 -> t2) -> t1) -> (t1 -> t2) -> t1'. Thêm dấu ngoặc đơn, chúng ta nhận được '((t1 -> t2) -> t1) -> ((t1 -> t2) -> t1)'. Để kiểu 'α' đứng cho' (t1 -> t2) -> t1', đây chỉ là 'α -> α', và do đó, theo tham số,' s (sk) 'là hàm nhận dạng với một chi tiết cụ thể hơn kiểu. (Và tất nhiên, '($) :: (a -> b) -> a -> b' là * cũng * chỉ là chức năng nhận dạng với một kiểu cụ thể hơn.) –

+0

Thật vậy, nếu chúng ta giảm' \ y -> \ z -> yz', chúng ta nhận được '\ y -> y'. – Vitus

+1

Trong bộ phối hợp, S K y z = K z (y z) = z. Sau đó S (S K) y z = S K z (y z) = K (y z) (z (y z)) = y z. – rickythesk8r

Các vấn đề liên quan