Tên của x.λf.fx (như áp dụng ngược) trong phép tính lambda là gì? Hàm tương ứng có tên chuẩn trong lập trình không?


15

Tên của x.λf.fx trong phép tính lambda là gì?

Hàm tương ứng có tên chuẩn trong các ngôn ngữ lập trình chức năng, như Haskell không?

Trong lập trình hướng đối tượng, có một tên thông thường cho một phương thức foolấy một hàm làm đối số, sao cho x.foo(f)trả về f(x)?


3
Bạn cần mua một cuốn từ điển.
Robert Harvey

13
Cái nào? Ở đâu? Bao nhiêu?
Alexey

4
Tôi không hiểu các downvote. Có vẻ như một câu hỏi hoàn toàn hợp lý với tôi.
Giorgio

Tôi đã đăng câu trả lời bên dưới nhưng tôi nhận ra rằng OP đang hỏi tên của biểu thức lambda này là gì nên tôi đã xóa = D
Jason

Khái niệm mà bạn đề cập đến được biết đến như là một công cụ kết hợp, hãy đọc ở đây nếu bạn không quen en.wikipedia.org/wiki/SKI_combinator_calculus mặc dù tôi không quen thuộc với một tổ hợp đã biết về bản chất mà bạn đề cập đến, C từ BCKW gần (không rõ) nhưng không giống en.wikipedia.org/wiki/B,C,K,W_system tại sao không có niềm vui và đưa ra sự kết hợp của các tổ hợp đó dẫn đến chức năng của bạn :)
Jimmy Hoffa

Câu trả lời:


9

Trong Haskell, \x.\f.f xflip ($)cái $được đọc là áp dụng , tôi sẽ đọc là áp dụng ngược .

Dựa vào /programming/4090168/is-there-an-inverse-of-the-haskell-operator


Điều này sai ... lật là \f.\x.\y.f y xlật là C ở đây en.wikipedia.org/wiki/B,C,K,W_system
Jimmy Hoffa

đồng thời thêm vào $để lật như thế này đang mong đợi một hàm được áp dụng một phần có hơn 2 đối số trong đó bạn sẽ chỉ lật 2 lần cuối để bạn áp dụng một phần tất cả trừ 2
Jimmy Hoffa

6
Vì vậy, bạn nghi ngờ rằng (\f.\x.\y.f y x) (\f.\x.f x)giảm để (\x.\f.f x)đổi tên modulo? Mà nó làm.
Dan D.

5

Sử dụng các tổ hợp chuẩn, bạn có thể biểu thị chức năng này như

C I

Ở đâu

C f x y = (f y) x

Trong Haskell nó sẽ là

flip id

Đây idlà loại chuyên (a -> b) -> a -> bfliphoán đổi a -> ba.

Bạn cũng có thể biểu thị nó trong phép tính SKI :

S (K (S I)) K

+1 để khấu trừ các tổ hợp cho việc này. Tôi thực sự không nghi ngờ đó là một điều được biết đến nhiều, mặc dù nếu anh ta xác định đó là thứ gì đó liên quan đến số nhà thờ, tôi có xu hướng tự hỏi liệu CI có được ghi nhận ở bất cứ đâu có liên quan trong các nghiên cứu về số của nhà thờ hay không
Jimmy Hoffa

5

Trong bản gốc Alonzo của Giáo Hội "The sỏi của lambda-chuyển đổi", ông biểu thị combinator này bởi T .

Trong bối cảnh các chữ số của Giáo hội, nó được gọi là exp . Điều này khớp với ký hiệu "tốc ký" được Church sử dụng cho "ứng dụng" của thuật ngữ N với thuật ngữ M : "[ M N ]" là viết tắt của "( NM )".

Tôi chưa nghe thấy một tên tiêu chuẩn cho một chức năng tương tự trong lập trình.


3

Điều này đôi khi được gọi là tổ hợp thrush và trong Clojure, nó được gọi là macro đầu tiên của luồng . Việc sử dụng chính của nó là cho phép bạn thể hiện một phép tính như một chuỗi các phép tính được xâu chuỗi theo thứ tự mà chúng thực hiện. Ví dụ, lấy một giá trị x, chuyển nó đến một hàm f, sau đó chuyển kết quả của f(x)hàm g, sẽ được viết là g(f(x))sử dụng thành phần chức năng tiêu chuẩn (hoặc g (f x)nếu bạn đang làm việc với dấu ngoặc đơn.) Điều này có thể gây khó xử khi có một số lượng lớn các hàm bị xiềng xích vì bạn phải đọc chúng theo thứ tự ngược lại cách chúng thực thi. Bộ kết hợp thrush cho phép bạn thể hiện điều này một cách khác nhau, nếu chúng ta định nghĩa bộ kết hợp thrush là:

T x f = f x
T x f g ... = T (T x f) g ...

Sau đó biểu thức T x f g htrở thành h (g (f x)).

(Đối với những người tìm kiếm thêm thông tin cũng như triển khai cụ thể trong ngôn ngữ Vợt, tôi có một bài đăng trên blog về chủ đề: Thrush Combinator in Vợt )


2

Tôi hy vọng tôi hiểu chính xác câu hỏi của bạn, nhưng tôi tin rằng đây được gọi là Toán tử ống (đảo ngược) trong các ngôn ngữ ML.

[1; 2; 3] |> List.map sq // let it = [1; 4; 9]

Ngoài ra còn có Nhà điều hành ống ngược giúp sắp xếp thứ tự các hoạt động.

printf "The value is.." <| 2 + 3 // let it = "The value is..5"

Điều này rất hữu ích vì hình thức không được đánh dấu

printf "The value is.." 2 + 3 ;; error

sẽ lỗi vì printf sẽ cố gắng đánh giá "The value is.." 2và lỗi vì không có +toán tử xác định . Để thực hiện công việc đó, hãy sử dụng dấu ngoặc đơn:

printf "The value is.." (2 + 3) // let it = "The value is..5"

Đối với việc sử dụng thực tế, |>toán tử này rất hữu ích và là bánh mì của nhiều ngôn ngữ lấy cảm hứng từ ML và ML như F #, LiveScript và Elixir. <|ít phổ biến hơn và thường chỉ được sử dụng khi nó tăng khả năng đọc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.