Apa nama λx.λf.fx (seperti berlaku terbalik) dalam kalkulus lambda? Apakah fungsi yang sesuai memiliki nama standar dalam pemrograman?


15

Apa nama λx.λf.fx dalam lambda calculus?

Apakah fungsi yang sesuai memiliki nama standar dalam bahasa pemrograman fungsional, seperti Haskell?

Dalam pemrograman berorientasi objek, apakah ada nama biasa untuk metode fooyang mengambil fungsi sebagai argumen, sehingga x.foo(f)kembali f(x)?


3
Anda perlu membeli kamus.
Robert Harvey

13
Yang mana? Dimana? Berapa banyak?
Alexey

4
Saya tidak mengerti downvotes. Tampaknya pertanyaan yang sangat masuk akal bagi saya.
Giorgio

Saya telah mengirim jawaban di bawah ini tetapi saya menyadari bahwa OP bertanya apa nama ekspresi lambda ini sehingga saya menghapus = D
Jason

Konsep yang Anda rujuk dikenal sebagai kombinator, baca di sini jika Anda tidak terbiasa en.wikipedia.org/wiki/SKI_combinator_calculus meskipun saya tidak akrab dengan kombinator yang diketahui dari sifat yang Anda rujuk, C dari BCKW dekat (itu flip) tetapi tidak sama en.wikipedia.org/wiki/B, C, K, W_system mengapa tidak bersenang-senang dan datang dengan kombinasi kombinator yang menghasilkan fungsi Anda :)
Jimmy Hoffa

Jawaban:


9

Dalam Haskell, \x.\f.f xadalah flip ($)yang sebagai $dibaca sebagai berlaku , saya akan dibaca sebagai sebaliknya berlaku .

Berdasarkan kasar pada /programming/4090168/is-there-an-inverse-of-the-haskell-operator


Ini salah ... flip adalah \f.\x.\y.f y xflip adalah C di sini en.wikipedia.org/wiki/B,C,K,W_system
Jimmy Hoffa

juga menambahkan $flip seperti ini mengharapkan fungsi yang diterapkan sebagian yang mengambil lebih dari 2 argumen di mana Anda hanya akan membalik 2 terakhir sehingga Anda menerapkan sebagian kecuali yang 2
Jimmy Hoffa

6
Jadi Anda ragu yang (\f.\x.\y.f y x) (\f.\x.f x)mengurangi untuk (\x.\f.f x)mengubah nama modulo? Yang itu.
Dan D.

5

Dengan menggunakan kombinator standar, Anda dapat menyatakan fungsi ini sebagai

C I

dimana

C f x y = (f y) x

Di Haskell itu akan

flip id

Berikut id's jenis khusus untuk (a -> b) -> a -> bdan flipswap a -> bdan a.

Anda juga dapat mengungkapkannya dalam kalkulus SKI :

S (K (S I)) K

+1 untuk menyimpulkan kombinator untuk ini. Saya benar-benar tidak curiga itu adalah hal yang banyak diketahui, meskipun jika ketika ia mengidentifikasi itu adalah sesuatu yang berkaitan dengan angka-angka gereja, saya cenderung bertanya-tanya apakah CI didokumentasikan di mana saja yang relevan dalam studi angka gereja siapa pun
Jimmy Hoffa

5

Di asli Alonzo Gereja "The kalkuli dari lambda konversi", ia menunjukkan combinator ini dengan T .

Dalam konteks angka Gereja, ini disebut exp . Ini cocok dengan notasi "steno" yang digunakan oleh Gereja untuk "penerapan" istilah N ke istilah M : "[ M N ]" singkatan "( NM )".

Saya belum pernah mendengar nama standar untuk fungsi analog dalam pemrograman.


3

Ini kadang-kadang disebut sebagai combushator sariawan , dan di Clojure itu disebut makro thread-pertama . Kegunaan utamanya adalah memungkinkan Anda untuk mengekspresikan perhitungan sebagai serangkaian perhitungan berantai dalam urutan yang mereka jalankan. Misalnya, mengambil nilai x, meneruskannya ke suatu fungsi f, kemudian meneruskan hasil f(x)ke suatu fungsi g, akan ditulis sebagai g(f(x))menggunakan komposisi fungsi standar (atau g (f x)jika Anda bekerja dengan tanda kurung implisit.) Ini bisa menjadi canggung ketika ada sejumlah besar fungsi berantai karena Anda harus membacanya dengan urutan terbalik bagaimana mereka mengeksekusi. Combushator thrush memungkinkan Anda mengekspresikan hal ini secara berbeda, jika kami mendefinisikan combushator thrush sebagai:

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

Kemudian ekspresi T x f g hmenjadi h (g (f x)).

(Bagi mereka yang mencari informasi lebih lanjut serta implementasi konkret dalam bahasa Racket, saya punya posting blog tentang subjek: Thrush Combinator in Racket )


2

Saya harap saya memahami pertanyaan Anda dengan benar, tetapi saya yakin ini dikenal sebagai (kebalikan) Operator Pipa dalam bahasa ML.

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

Ada juga Operator Pipa Reverse yang membantu dengan urutan operasi.

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

Ini berguna karena formulir yang belum dipipet

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

akan kesalahan karena printf akan mencoba untuk mengevaluasi "The value is.." 2dan kesalahan karena tidak ada +operator yang ditentukan . Untuk membuatnya bekerja, gunakan tanda kurung:

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

Adapun penggunaan praktis, |>operator sangat berguna dan roti dan mentega dari banyak bahasa yang terinspirasi ML dan ML seperti F #, LiveScript dan Elixir. <|kurang umum dan biasanya hanya digunakan ketika meningkatkan keterbacaan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.