Sử dụng Γ
Việc sử dụng chính của tích hợp Γ
, được gọi là khớp mẫu trong danh sách hoặc giải cấu trúc danh sách , là chia danh sách thành phần đầu và đuôi và áp dụng hàm nhị phân trên chúng. Điều này tương ứng với thành ngữ Haskell phù hợp với thành ngữ
f (x : xs) = <something>
f [] = <something else>
trong đó <something>
một biểu thức có chứa x
, xs
và có thể f
. Có 4 quá tải Γ
, mỗi cái hoạt động khác nhau một chút.
list
Quá tải đầu tiên list
, có một giá trị a
và hàm nhị phân f
. Nó trả về một chức năng mới có một danh sách, trả về a
nếu nó trống và gọi f
vào đầu và đuôi nếu nó không trống. Ví dụ: Γ_1€
lấy một danh sách, trả về -1
nếu nó trống và chỉ mục xuất hiện đầu tiên của phần tử đầu tiên ở đuôi nếu không.
listN
Quá tải thứ hai, listN
tương tự như list
, ngoại trừ a
được bỏ qua và giá trị mặc định của loại trả về được sử dụng thay thế. Ví dụ, Γ€
tương đương với Γ0€
, vì giá trị số mặc định là 0
.
Trong thực tế, listN
được sử dụng thường xuyên hơn list
, vì giá trị mặc định là không liên quan hoặc chính xác những gì bạn cần. Một mô hình phổ biến là Γ~αβγ
, nơi αβγ
có ba chức năng; điều này áp dụng β
cho phần tử đầu tiên và γ
phần đuôi, và kết hợp các kết quả với α
. Nó đã được sử dụng ví dụ trong câu trả lời này . Các mẫu khác bao gồm chỉ Γo:α
áp dụng α
cho phần tử đầu tiên và Γ·:mα
để áp dụng α
cho tất cả các phần tử ngoại trừ phần tử đầu tiên. Thứ hai đã được sử dụng trong câu trả lời này .
listF
Quá tải thứ ba là một chút liên quan. Giống như list
, nó nhận một giá trị a
và một hàm f
và trả về một hàm mới g
có một danh sách. Tuy nhiên, lần này f
có một đối số hàm bổ sung, g
chính nó và có thể gọi nó trên bất kỳ giá trị nào (bao gồm, nhưng không giới hạn ở phần đuôi của danh sách đầu vào). Điều này có nghĩa là listF
thực hiện một sơ đồ đệ quy chung trong danh sách.
listF
không được sử dụng rất thường xuyên, vì đệ quy rõ ràng với list
/ listN
thường có cùng độ dài hoặc ngắn hơn, như trong câu trả lời này .
listNF
listNF
là listF
những gì listN
là list
: đầu vào a
được bỏ qua, và giá trị mặc định của kiểu trả về được sử dụng để thay thế. Trong trường hợp hiếm hoi, nó có thể ngắn hơn một nếp gấp bên phải, ví dụ trong câu trả lời này .
Như một ví dụ về các phiên bản đệ quy của Γ
, hàm này Γλ·:o⁰↔
xáo trộn một danh sách theo thứ tự đầu tiên, cuối cùng, thứ hai, thứ hai đến cuối cùng, thứ ba, thứ ba đến cuối cùng, v.v.
Hãy thử trực tuyến!
Hàm f
này là lambda rõ ràng λ·:o⁰↔
, có đối số ⁰
là toàn bộ hàm. Điều gì f
làm là đảo ngược đuôi với ↔
, sau đó gọi hàm chính theo cách đệ quy với o⁰
, và cuối cùng giải quyết đầu trở lại với ·:
. Tất nhiên, Γ·:o₀↔
là một byte ngắn hơn, nhưng không hoạt động nếu dòng chứa thứ gì khác ngoài chức năng này.