Lambda hesabında λx.λf.fx (tersi uygulama gibi) adı nedir? İlgili fonksiyonun programlamada standart bir adı var mı?


15

Lambda hesabında λx.λf.fx adı nedir?

İlgili işlevin Haskell gibi işlevsel programlama dillerinde standart bir adı var mı?

Nesne yönelimli programlamada, bir olağan isim bir yöntem yoktur fooböyle bir argüman olarak bir işlev alır x.foo(f)döner f(x)?


3
Bir sözlük satın almanız gerekiyor.
Robert Harvey

13
Hangisi? Nerede? Ne kadar?
Alexey

4
Downvotes anlamıyorum. Bana çok makul bir soru gibi geliyor.
Giorgio

Aşağıda bir cevap gönderdim ancak OP'nin bu lambda ifadesinin adının ne olduğunu sorduğunu fark ettim, bu yüzden sildim = D
Jason

Bahsettiğiniz kavram bir birleştirici olarak bilinir, en.wikipedia.org/wiki/SKI_combinator_calculus'a aşina değilseniz, burada okuduğunuz halde, bahsettiğiniz doğanın bilinen bir birleştiricisine aşina olmadığım halde, C BCKW yakın (flip) ama aynı değil en.wikipedia.org/wiki/B,C,K,W_system neden biraz eğlenmiyoruz ve fonksiyonunuzla sonuçlanan birleştiricilerin kombinasyonuyla ortaya çıkıyor :)
Jimmy Hoffa

Yanıtlar:


9

Haskell'de \x.\f.f xolduğu flip ($)kadar hangi $bölgesinde olduğu uygulamak Ben okurdum, ters geçerlidir .

Kabaca /programming/4090168/is-there-an-inverse-of-the-haskell-operator dayalı


Bu yanlış ... flip \f.\x.\y.f y xflip burada C en.wikipedia.org/wiki/B,C,K,W_system
Jimmy Hoffa

Ayrıca $, bunun gibi çevirmeyi ekleyerek , yalnızca son 2'yi çevireceğiniz 2 argümanı alan kısmen uygulanan bir işlev bekliyorsunuz, bu yüzden bu 2 dışında tümünü kısmen
uygulıyorsunuz

6
Yani bu modulo yeniden adlandırma (\f.\x.\y.f y x) (\f.\x.f x)azaltır (\x.\f.f x)? Hangi yapar.
Dan D.

5

Standart birleştiricileri kullanarak bu işlevi şu şekilde ifade edebilirsiniz:

C I

nerede

C f x y = (f y) x

Haskell'de olurdu

flip id

İşte idtürü uzmanlaşmış (a -> b) -> a -> bve fliptakas a -> bve a.

Ayrıca SKI hesabında da ifade edebilirsiniz :

S (K (S I)) K

Bunun için birleştiricileri çıkarmak için +1. Bunun çok bilinen bir şey olduğundan şüphelenmiyorum, ancak eğer kilise rakamlarıyla ilgili bir şey tespit ederse, CI'nin anyonlar kilise sayısal çalışmalarında ilgili herhangi bir yerde belgelenip belgelenmediğini merak etmeye eğilimliyim
Jimmy Hoffa

5

Orijinal Alonzo Kilisesi'nin "Lambda dönüşümünün hesabı" nda, T tarafından bu birleştiriciyi ifade eder .

Kilise rakamları bağlamında buna exp denir . Bu dönem "uygulaması" için Church tarafından kullanılan "kısaltılmış" ifadesi ile eşleşen N dönem için M : "[ M K ]" "(açılımı NM )".

Programlamada benzer bir işlev için henüz standart bir isim duymadım.


3

Bu bazen pamukçuk birleştiricisi olarak adlandırılır ve Clojure'da buna ilk iplik makrosu denir . Birincil kullanımı, bir hesaplamayı yürüttükleri sırayla bir dizi zincirleme hesaplama olarak ifade etmenize izin vermektir. Örneğin, bir değer almak x, bir işleve aktarmak f, sonra sonuçları f(x)bir işleve aktarmak g, g(f(x))standart işlev kompozisyonu kullanarak (veya g (f x)örtük parantezlerle çalışıyorsanız.) Çok sayıda zincirleme işlev olduğunda bu garip olabilir, çünkü bunları yürütme biçimlerinin tersini okumak zorundasınız. Pamukçuk birleştiricisi şu şekilde tanımlarsak pamukçuk birleştiricisi bunu farklı şekilde ifade etmenizi sağlar:

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

Sonra ifade T x f g holur h (g (f x)).

(Racket dilinde daha fazla bilgi ve somut bir uygulama isteyenler için bu konuda bir blog yazısı var: Racket'te Pamukçuk Birleştiricisi )


2

Umarım sorunuzu doğru anlıyorum, ancak bunun ML dillerinde (ters) Boru Operatörü olarak bilindiğine inanıyorum.

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

İşlem sırasına yardımcı olan Ters Boru Operatörü de vardır.

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

Bu yararlıdır, çünkü açılmamış form

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

"The value is.." 2tanımlı +operatör olmadığından printf değerlendirmeyi ve hata vermeyi denediğinden hata olur . Bu işi yapmak için parantez kullanın:

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

Pratik kullanıma gelince, |>operatör inanılmaz derecede kullanışlıdır ve F #, LiveScript ve Elixir gibi ML ve ML'den ilham alan birçok dilin ekmek ve tereyağı. <|daha az yaygındır ve tipik olarak yalnızca okunabilirliği arttırdığında kullanılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.