Genelleştirilmiş cebirsel veri türü - Generalized algebraic data type

İçinde fonksiyonel programlama, bir genelleştirilmiş cebirsel veri türü (GADT, Ayrıca birinci sınıf fantom türü,[1] korumalı özyinelemeli veri türü,[2] veya eşitlik nitelikli tip[3]) bir genellemedir parametrik cebirsel veri türleri.

Genel Bakış

Bir GADT'de, ürün oluşturucular ( veri oluşturucular içinde Haskell ), dönüş değerinin tür somutlaştırması olarak ADT'nin açık bir örneğini sağlayabilir. Bu, işlevleri daha gelişmiş bir tür davranışıyla tanımlamaya izin verir. Haskell 2010'un bir veri yapıcısı için, dönüş değeri, yapıcının uygulamasında ADT parametrelerinin somutlaştırılmasının ima ettiği tür somutlaştırmasına sahiptir.

- GADT olmayan parametrik bir ADTveri Liste a = Nil | Eksileri a (Liste a)tamsayılar = Eksileri 12 (Eksileri 107 Nil)       - tamsayı türü List Int'dirTeller = Eksileri "tekne" (Eksileri "rıhtım" Nil) - dizge türü List String'dir- Bir GADTveri İfade a nerede    EBool  :: Bool     -> İfade Bool    EInt   :: Int      -> İfade Int    EEqual :: İfade Int -> İfade Int  -> İfade Booldeğerlendirme :: İfade a -> adeğerlendirme e = durum e nın-nin    EBool a    -> a    EInt a     -> a    EEqual a b -> (değerlendirme a) == (değerlendirme b)ifade1 = EEqual (EInt 2) (EInt 3)        - ifade1 türü İfade Bool'durret = değerlendirme ifade1                        - ret Yanlıştır

Şu anda GHC standart olmayan bir uzantı olarak derleyici, diğerleri arasında, Puglar ve Darcs. OCaml 4.00 sürümünden itibaren GADT'yi yerel olarak destekler.[4]

GHC uygulaması, varoluşsal olarak ölçülen tip parametreleri ve yerel kısıtlamalar için destek sağlar.

Tarih

Genelleştirilmiş cebirsel veri türlerinin erken bir versiyonu, Augustsson ve Petersson (1994) ve dayalı desen eşleştirme içinde ALF.

Genelleştirilmiş cebirsel veri türleri bağımsız olarak tanıtıldı: Cheney ve Hinze (2003) ve öncesinde Xi, Chen ve Chen (2003) uzantılar olarak ML 's ve Haskell 's cebirsel veri türleri.[5] Her ikisi de esasen birbirine eşdeğerdir. Benzerler tümevarımlı veri türleri aileleri (veya endüktif veri türleri) içinde bulunan Coq 's Endüktif Yapılar Hesabı ve diğeri bağımlı yazılan diller, bağımlı türleri modulo ve ikincisinin ek bir pozitiflik kısıtlaması bu, GADT'lerde uygulanmaz.[6]

Sulzmann, Wazny ve Stuckey (2006) tanıtıldı genişletilmiş cebirsel veri türleri GADT'leri varoluşsal veri türleri ve tip sınıfı tarafından getirilen kısıtlamalar Perry (1991), Läufer ve Odersky (1994) ve Läufer (1996).

Çıkarım türü sağlanan herhangi bir programlayıcının yokluğunda ek açıklamalar yazın dır-dir karar verilemez[7] ve GADT'ler üzerinden tanımlanan işlevler kabul etmez ana türler Genel olarak.[8] Tip rekonstrüksiyonu birkaç tasarım değiş tokuşu gerektirir ve aktif bir araştırma alanıdır (Peyton Jones, Washburn ve Weirich 2004; Peyton Jones vd. 2006; Pottier ve Régis-Gianas 2006; Sulzmann, Schrijvers ve Stuckey 2006; Simonet ve Pottier 2007; Schrijvers vd. 2009; Lin ve Sheard 2010a; Lin ve Sheard 2010b; Vytiniotis, Peyton Jones ve Schrijvers 2010; Vytiniotis vd. 2011).

Başvurular

GADT'lerin uygulamaları şunları içerir: genel programlama, modelleme programlama dilleri (üst düzey soyut sözdizimi ), sürdürmek değişmezler içinde veri yapıları, kısıtlamaları ifade etmek yerleşik alana özgü diller ve nesneleri modelleme.[9]

Üst düzey soyut sözdizimi

GADT'lerin önemli bir uygulaması, üst düzey soyut sözdizimi içinde güvenli yazın moda. İşte bir katıştırılmış basit yazılan lambda hesabı keyfi bir koleksiyonla baz türleri, demetler ve bir sabit nokta birleştirici:

veri Lam :: * -> * nerede  Kaldırma :: a                     -> Lam a        - ^ yükselen değer  Çift :: Lam a -> Lam b        -> Lam (a, b)   - ^ ürün  Lam  :: (Lam a -> Lam b)      -> Lam (a -> b) - ^ lambda soyutlama  Uygulama  :: Lam (a -> b) -> Lam a -> Lam b        - ^ işlev uygulaması  Düzelt  :: Lam (a -> a)          -> Lam a        - ^ sabit nokta

Ve bir tür güvenli değerlendirme işlevi:

değerlendirme :: Lam t -> tdeğerlendirme (Kaldırma v)   = vdeğerlendirme (Çift l r) = (değerlendirme l, değerlendirme r)değerlendirme (Lam f)    = x -> değerlendirme (f (Kaldırma x))değerlendirme (Uygulama f x)  = (değerlendirme f) (değerlendirme x)değerlendirme (Düzelt f)    = (değerlendirme f) (değerlendirme (Düzelt f))

Faktöriyel işlevi artık şu şekilde yazılabilir:

gerçek = Düzelt (Lam (f -> Lam (y -> Kaldırma (Eğer değerlendirme y == 0 sonra 1 Başka değerlendirme y * (değerlendirme f) (değerlendirme y - 1)))))değerlendirme(gerçek)(10)

Normal cebirsel veri türlerini kullanarak problemlerle karşılaşırdık. Tür parametresinin kaldırılması, yükseltilmiş temel türlerin varoluşsal olarak ölçülmesini sağlar ve bu da değerlendiricinin yazılmasını imkansız hale getirir. Bir tür parametresiyle, yine de tek bir temel türle sınırlı kalırdık. Ayrıca, gibi biçimsiz ifadeler Uygulama (Lam (x -> Lam (y -> Uygulama x y))) (Doğru Kaldırma) GADT kullanılarak yanlış yazılırken inşa etmek mümkün olabilirdi. İyi biçimlendirilmiş bir analog Uygulama (Lam (x -> Lam (y -> Uygulama x y))) (Kaldırma (z -> Doğru)). Bunun nedeni x dır-dir Lam (a -> b)türünden çıkarsanan Lam veri yapıcısı.

Ayrıca bakınız

Notlar

  1. ^ Cheney ve Hinze 2003.
  2. ^ Xi, Chen ve Chen 2003.
  3. ^ Sheard ve Pasalic 2004.
  4. ^ "OCaml 4.00.1". ocaml.org.
  5. ^ Cheney ve Hinze 2003, s. 25.
  6. ^ Cheney ve Hinze 2003, s. 25–26.
  7. ^ Peyton Jones, Washburn ve Weirich 2004, s. 7.
  8. ^ Schrijvers vd. 2009, s. 1.
  9. ^ Peyton Jones, Washburn ve Weirich 2004, s. 3.

daha fazla okuma

Başvurular
Anlambilim
  • Patricia Johann ve Neil Ghani (2008). "GADT'lerle Yapılandırılmış Programlamanın Temelleri".
  • Arie Middelkoop, Atze Dijkstra ve S. Doaitse Swierstra (2011). "GADT'ler için yalın bir şartname: birinci sınıf eşitlik kanıtlarına sahip sistem F". Yüksek Dereceli ve Sembolik Hesaplama.
Tip rekonstrüksiyonu
Diğer
  • Andrew Kennedy ve Claudio V. Russo. "Genelleştirilmiş cebirsel veri türleri ve nesne yönelimli programlama". 20. yıllık ACM SIGPLAN Nesne yönelimli programlama, sistemler, diller ve uygulamalar konferansı Bildirilerinde. ACM Press, 2005.

Dış bağlantılar