Saf bir λ fonksiyonunun, soyutlamalar ve uygulamalar dışındaki bir terim olmasına izin verin. JavaScript'te, argüman listesini toplayan değişken fonksiyonlara tüm soyutlamaları uygulayarak saf bir işlevin kaynak kodunu bulmak mümkündür. Yani bu mümkündür: Haskell'de saf λ fonksiyonunun normalleştirilmiş kaynağını bulmak mümkün mü?
lambdaSource(function(x){return x(x)}) == "λx.(x x)"
bu ana fikri üzerine
lambdaSource kodunu bakın. Bu fonksiyon benim ilgi alanım için özellikle yararlı oldu çünkü mevcut JS motorlarını, benim tarafımdan kodlayabileceğim herhangi bir naif değerlendiriciden çok daha hızlı bir şekilde not edilmemiş lambda hesaplamaları normalleştirmek için kullanmamı sağlıyor. Üstelik ben λ-matematik fonksiyonları
unsafeCoerce
yardımıyla Haskell ifade edilebilir biliyorum:
(let (#) = unsafeCoerce in (\ f x -> (f # (f # (f # x)))))
Çünkü variadic fonksiyonların eksikliği Haskell lambdaSource
nasıl uygulanacağı bilmiyorum.
lambdaSource (\ f x -> f # (f # (f # x))) == "λ f x . f (f (f x))"
: o böyle, Haskell üzerinde saf bir λ fonksiyonunun normalize kaynağını anlaması mümkün mü?
Bunu mu demek istediniz: untyped lambda calculus? – Yuuri
Her zamanki yaklaşım, başka bir şeydir: lambda'nın yapısal bir temsili oluşturmak ve sadece son saniyede bir (Haskell) lambdaya dönüştürmek. Örneğin. "HOAS" (https://en.wikipedia.org/wiki/Higher-order_abstract_syntax) ile ilgili bir şeyler okumak isteyebilirsiniz. Bunların arasında “Lambda (\ f -> Lambda (\ x -> f: # (f) : # (f: # x)))) 'uygun bir veri tanımı ile. –
Haskell'de bunu yapabileceğinizi sanmıyorum, çünkü işlevler herhangi bir çalışma zamanı temsilcisine sahip değil (JS'nin aksine, nesnelerin olduğu yerde). Ben de işlevler için 'Show' örneği yok iyi bir nedeni var sanırım. – Bergi