Tür sınıflarının matematiksel (kategorik) açıklaması


14

İşlevsel bir dil , nesnelerinin türleri olduğu ve aralarındaki morfizmlerin işlev gördüğü bir kategori olarak görülebilir .

Tür sınıfları bu modele nasıl uyuyor?

Sadece çoğu tip sınıfının sahip olduğu kısıtlamayı karşılayan ancak Haskell'de ifade edilmeyen uygulamaları dikkate almamız gerektiğini varsayıyorum. Örneğin, yalnızca bu uygulamaları göz önünde bulundurmalıdır Functorkendisi için fmap id ≡ idve fmap f . fmap g ≡ fmap (f . g).

Yoksa tür sınıfları için başka teorik temeller var mı (örneğin, daktilo edilmiş lambda calculi'ye dayalı)?


1
Bir model için tam olarak ne istediğiniz konusunda daha açık olmak isteyebilirsiniz. Açık dünya varsayımını, örnek çözümlemesinin davranışını, çeşitli GHC uzantılarının etkileşimini & c. Benzer şekilde, Hask tartışılırken diplerin genellikle göz ardı edildiğine dikkat edin.
CA McCann

4
Tip sınıfları imza olarak düşünülebilir (evrensel cebir anlamında). Aynı imzayı paylaşan tüm varlıkların (aynı tür sınıftaki öğeler) koleksiyonu çeşitlidir .
Dave Clarke

1
@DaveClarke: Yazım sınıflarını daha yüksek türlerde nasıl bu şekilde tanımlayacağım hemen belli değil, ama evrensel cebire çok aşina değilim ve aklınızdaki yazışmayı yanlış anlıyor olabilirim ...
CA McCann

1
@camccann: Yazışmanın ne kadar ileri gittiğinden emin değilim. Kesinlikle iyi bir başlangıç ​​noktası gibi görünüyordu.
Dave Clarke

2
@camccann: Sadece cebirinizi tanımladığınız temel kategoriyi değiştirin: num gibi temel tip sınıfları, haskell türleri (veya Hsk kategorisindeki nesneler) kategorisinin üzerindeki imzalardır, tip yapıcılarının üzerindeki tip sınıfları, functors kategorisindeki cebirlerdir. Hask'tan Hask'a. Evrensel cebirin kategori teorisindeki cebir kavramına tamamen uyduğunu unutmayın. Ayrıca: Dave: Yorumunuzu bir cevaba dönüştürmelisiniz.
cody

Yanıtlar:


18

Tür sınıfları bu modele nasıl uyuyor?

Kısa cevap: Yapmıyorlar.

Bir dile zorlamalar, tip sınıfları veya ad-hoc polimorfizm için başka mekanizmalar eklediğinizde, karşılaştığınız ana tasarım tutarlılıktır .

Temel olarak, iyi yazılmış bir programın tek bir yorumu olması için tip sınıfı çözünürlüğün deterministik olduğundan emin olmanız gerekir. Örneğin, aynı kapsamda aynı kapsamda birden çok örnek verebilirseniz, bunun gibi belirsiz programlar yazabilirsiniz:

class Blah a where
   blah : a -> String 

instance Blah T where
   blah _ = "Hello"

instance Blah T where
   blah _ = "Goodbye"

v :: T = ...

main :: IO ()
main = print (blah v)  -- does this print "Hello" or "Goodbye"?

Derleyicinin yaptığı örnek seçimine bağlı olarak, veya blah vdeğerine eşit olabilir . Bu nedenle, bir programın anlamı, programın sözdizimi tarafından tam olarak belirlenmez, aksine derleyicinin yaptığı keyfi seçimlerden etkilenebilir."Hello""Goodbye"

Haskell'in bu soruna çözümü, her türün her tür sınıf için en fazla bir örneği olmasını istemektir. Bunu sağlamak için, örnek bildirimlere yalnızca en üst düzeyde izin verir ve ayrıca tüm bildirimleri global olarak görünür hale getirir. Bu şekilde, belirsiz bir örnek bildirimi yapılırsa derleyici her zaman bir hata sinyali verebilir.

Ancak, bildirimleri global olarak görünür kılmak anlambilimin kompozisyonunu bozar. Kurtarmak için yapabileceğiniz şey , programlama dili için ayrıntılı bir anlambilim sunmaktır - yani, Haskell programlarının daha iyi davranışlı, daha kompozisyonlu bir dile nasıl çevrileceğini gösterebilirsiniz.

Bu aslında daktilo türlerini derlemenin bir yolunu sunar - buna genellikle Haskell çevrelerinde "kanıt çevirisi" veya "sözlükten geçiş" denir ve çoğu Haskell derleyicisinin ilk aşamalarından biridir.

Tipler ayrıca programlama dili tasarımının saf tür teorisinden nasıl farklı olduğuna iyi bir örnektir. Tipik sınıflar gerçekten harika bir dil özelliğidir, ancak kanıt teorik açıdan oldukça kötü davranırlar. (Bu yüzden Agda'nın tipik sınıfları yoktur ve Coq neden onları sezgisel çıkarım altyapısının bir parçası yapar.)


aday yukarı koşucu ne yok denotasyonel anlambilim iyswim var?
Ohad Kammar

1
Hiçbir fikrim yok, ne yazık ki.
Neel Krishnaswami

Bu ek bir soruya değer mi?
Ohad Kammar

@NeelKrishnaswami: ML modüllerinin buna nasıl uyduğu hakkında bir fikriniz var mı? Peki ya Agda modülleri (benden bahsettiğim biri "birinci sınıf")?
Lii

1
@Lii: ML modülleri ve Agda kayıtları çok daha iyi davranır , ancak bir yorumda açıklamak çok karmaşıktır - bunlar hakkında bir soru sorun ve ben (veya başka biri) açıklayacağım.
Neel Krishnaswami
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.