Yanıtlar:
İlk olarak jmad tarafından açıklandığı gibi doğal sayıları ve çiftleri kodlayın.
K tamsayı k = a - b olacak şekilde bir çift doğal sayı edilir . Sonra tamsayılar üzerinde olağan işlemleri şöyle tanımlayabilirsiniz ( \ lambda -calculus için Haskell gösterimini kullanarak ):
neg = \k -> (snd k, fst k)
add = \k m -> (fst k + fst m, snd k + snd m)
sub = \k m -> add k (neg m)
mul = \k m -> (fst k * fst m + snd k * snd m, fst k * snd m + snd k * fst m)
Karmaşık sayılar söz konusu olduğunda, karmaşık sayının bir çift real olarak kodlanması anlamında benzerdir. Ancak daha karmaşık bir soru, gerçeklerin nasıl kodlanacağıdır. Burada daha fazla iş yapmanız gerekiyor:
Gerçekleri kodlamak çok iştir ve aslında -culculus içinde yapmak istemezsiniz. Ancak saf Haskell'deki gerçeklerin basit bir uygulaması için Marshall'ın alt dizinine bakınız . Bu prensip olarak saf hesabına çevrilebilir.λetc/haskell
i:ℤ
, x:a
, f,u,s:a→a
, p:(a→a,a→a)
] siz ℤ kodlarsanız (Sign,ℕ)
fonksiyonların bir çift göz önüne alındığında, daha sonra (s,f)
şekilde p
terimi λi.λp.λx.(fst i) (fst p) id ((snd i) (snd p) x)
üretecek ya f(…f(x)…)
veya s(f(…f(x)…))
(sonuç negatif olduğu takdirde). Eğer ℤ olarak kodlamak varsa (ℕ,ℕ)
, bir ters olan bir işlev gerekir - bir çift verildi (f,u)
ve x
fonksiyon λi.λp.λx.(snd i)(snd p)((fst i)(fst p) x)
üretecek u(…u(f(…f(x)…))…)
bırakacak olan f
uygulamalı i
kez x
. Her ikisi de farklı bağlamlarda çalışır (sonuç "ters f
çevrilebilir " || tersine çevrilebilir).
fold . ctor
herhangi bir kurucu ve bu tip fold
( r
) için. (Bu nedenle, özyinelemeli türler için veriler "kendi başına geri çekilecektir". Özyinelemeli olmayan türler için bu daha çok bir case
/ model eşleşmesi gibidir.)
Lambda hesabı çoğu veri yapısını ve temel türleri kodlayabilir. Örneğin, genellikle negatif olmayan tamsayıları ve boolean'ı kodlamak için gördüğünüz aynı Church kodlamasını kullanarak lambda hesabında bir çift mevcut terimi kodlayabilirsiniz:
Sonra çifti olan ve geri almak istiyorsanız ve yapabileceğiniz ve .
Bu, bir çiftle pozitif ve negatif tam sayıları kolayca temsil edebileceğiniz anlamına gelir: soldaki işaret ve sağdaki mutlak değer. İşaret, sayının pozitif olup olmadığını belirten bir mantıksaldır. Sağ, Kilise kodlamasını kullanan doğal bir sayıdır.
Ve şimdi göreceli tamsayılarınız var. Çarpmanın tanımlanması kolaydır, sadece işlevini işarete ve doğal sayılardaki çarpımı mutlak değere uygulamanız :
Eklemeyi tanımlamak için, iki doğal sayıyı karşılaştırmanız ve işaretler farklı olduğunda çıkarma kullanmanız gerekir, bu nedenle bu bir λ terimi değildir, ancak gerçekten istiyorsanız:
ancak çıkarmanın tanımlanması gerçekten kolaydır:
Pozitif ve negatif tamsayılarınız olduğunda karmaşık tam sayıları çok kolay bir şekilde tanımlayabilirsiniz : temsil iki tamsayıdan sadece bir çifttir . Sonra ekleme nokta-bilge ve çarpma her zamanki gibi , ama ben yazmayacağım, kolay olmalı: