Nhờ tất cả những ai đã trả lời câu hỏi của tôi. Tôi đã nghiên cứu câu trả lời của bạn. Để chắc chắn rằng tôi hiểu những gì tôi đã học được, tôi đã viết câu trả lời của riêng tôi cho câu hỏi của tôi. Nếu câu trả lời của tôi không đúng, xin vui lòng cho tôi biết.
Chúng tôi bắt đầu với các loại k
và s
: Tác phẩm đầu tay
k :: t1 -> t2 -> t1
k = (\a x -> a)
s :: (t3 -> t4 -> t5) -> (t3 -> t4) -> t3 -> t5
s = (\f g x -> f x (g x))
Hãy vào determing loại chữ ký của (s k)
.
Nhớ lại s
's định nghĩa:
s = (\f g x -> f x (g x))
Thay k
cho f
kết quả trong (\f g x -> f x (g x))
hợp đồng để:
(\g x -> k x (g x))
quan trọng Loại g và x phải phù hợp với k
' s nhập chữ ký.
Nhớ lại rằng k
có kiểu chữ ký này:
k :: t1 -> t2 -> t1
Vì vậy, đối với chức năng định nghĩa k x (g x)
này, chúng ta có thể suy ra:
Loại x
là loại đối số đầu tiên k
's , là loại t1
.
Loại đối số thứ hai của k
là t2
, do đó, kết quả của (g x)
phải là t2
.
g
có x
làm đối số mà chúng tôi đã xác định có loại t1
. Vì vậy, chữ ký loại (g x)
là (t1 -> t2)
.
Loại kết quả k
là t1
, do đó, kết quả của (s k)
là t1
.
Vì vậy, loại chữ ký của (\g x -> k x (g x))
là thế này:
(t1 -> t2) -> t1 -> t1
Tiếp theo, k
được định nghĩa để luôn luôn trả số đầu tiên của nó.Vì vậy, đây:
k x (g x)
hợp đồng này:
x
Và đây:
(\g x -> k x (g x))
hợp đồng này:
(\g x -> x)
Được rồi, bây giờ chúng tôi đã tìm ra (s k)
:
s k :: (t1 -> t2) -> t1 -> t1
s k = (\g x -> x)
Bây giờ, hãy xác định chữ ký loại s (s k)
.
Chúng tôi tiến hành theo cách tương tự.
Nhớ lại s
's định nghĩa:
s = (\f g x -> f x (g x))
Thay (s k)
cho f
kết quả trong (\f g x -> f x (g x))
hợp đồng để:
(\g x -> (s k) x (g x))
quan trọng Loại g
và x
phải phù hợp với (s k)
' s nhập chữ ký.
Nhớ lại rằng (s k)
có kiểu chữ ký này:
s k :: (t1 -> t2) -> t1 -> t1
Vì vậy, đối với chức năng định nghĩa (s k) x (g x)
này, chúng ta có thể suy ra:
Loại x
là loại đối số đầu tiên (s k)
's , là loại (t1 -> t2)
.
Loại đối số thứ hai của (s k)
là t1
, do đó kết quả của (g x)
phải là t1
.
g
có đối số của nó, mà chúng tôi đã xác định là loại (t1 -> t2)
. Vì vậy, chữ ký loại (g x)
là ((t1 -> t2) -> t1)
.
Loại kết quả của (s k)
là t1
, do đó, kết quả của s (s k)
là t1
.
Vì vậy, loại chữ ký của (\g x -> (s k) x (g x))
là thế này:
((t1 -> t2) -> t1) -> (t1 -> t2) -> t1
Trước đó chúng tôi xác định rằng s k
có định nghĩa này:
(\g x -> x)
Nghĩa là, nó là một chức năng mà phải mất hai đối số và trả về giá trị thứ hai.
Vì vậy, điều này:
(s k) x (g x)
Hợp đồng này:
(g x)
Và đây:
(\g x -> (s k) x (g x))
hợp đồng này:
(\g x -> g x)
OK, bây giờ chúng tôi đã tìm ra s (s k)
.
s (s k) :: ((t1 -> t2) -> t1) -> (t1 -> t2) -> t1
s (s k) = (\g x -> g x)
Cuối cùng, so sánh các loại chữ ký của s (s k)
với kiểu chữ ký của chức năng này:
p = (\g x -> g x)
Loại p
là:
p :: (t1 -> t) -> t1 -> t
p
và s (s k)
có cùng một định nghĩa (\g x -> g x)
vậy tại sao chúng có chữ ký kiểu khác nhau?
Lý do mà s (s k)
có chữ ký loại khác với p
là không có ràng buộc nào trên p
. Chúng tôi thấy rằng s
trong (s k)
bị ràng buộc phải nhất quán với chữ ký loại k
và s
đầu tiên trong s (s k)
bị ràng buộc để nhất quán với chữ ký loại (s k)
. Vì vậy, chữ ký loại s (s k)
bị hạn chế do đối số của nó. Mặc dù p
và s (s k)
có cùng định nghĩa, các ràng buộc trên g
và x
khác nhau.
Loại thứ hai giống với kiểu đầu tiên, chỉ chặt chẽ hơn. Có bất kỳ ràng buộc nào về 'X' và' Y' không? – fuz