Lisp ve Şema Türleri


10

Şimdi Racket'in türleri olduğunu görüyorum. İlk bakışta Haskell tiplemesiyle neredeyse aynı görünüyor. Peki Lisp'in CLOS Haskell tiplerinin kapsadığı bazı alanları kapsıyor mu? Herhangi bir OO dilinde çok katı bir Haskell türü ve bir nesne oluşturmak belirsiz bir şekilde benzer görünüyor. Sadece Haskell kool-yardımının bir kısmını içtim ve Lisp yoluna gidersem dinamik yazım yüzünden vidalanacağımdan tamamen paranoyayım.

Yanıtlar:


6

CL tipi sistem Haskell sisteminden daha etkileyici , örneğin (or (integer 1 10) (integer 20 30))bir değer için bir tipiniz olabilir 1,2,...9,10,20,21,...,30.

Bununla birlikte, Lisp derleyicileri tip güvenliği anlayışlarını boğazınızdan aşağıya zorlamaz, bu nedenle "notlarını" göz ardı edebilirsiniz - kendi sorumluluğunuzdadır .

Bu, tüm değer türlerini bildirerek ve gerekli tüm türlerin çıkarıldığından emin olarak dikkatle Lisp'e (konuşabilmek için) Haskell yazabileceğiniz anlamına gelir, ancak daha sonra Haskell'i ilk etapta kullanmak daha kolaydır.

Temel olarak, güçlü statik yazım istiyorsanız, Haskell veya OCaml kullanın, güçlü dinamik yazım istiyorsanız, Lisp kullanın. Zayıf statik yazma istiyorsanız, C kullanın, zayıf dinamik yazma istiyorsanız Perl / Python kullanın. Her yolun avantajları (ve zelotları) ve dezavantajları (ve detraktörleri) vardır, böylece hepsini öğrenmekten faydalanırsınız.


19
"Boğazınıza tip güvenliği zorla" gibi terimler kullanan herkes, hangi tip emniyetin olduğunu veya neden yararlı olduğunu anlamıyor.
Mason Wheeler

11
@MasonWheeler: Tek bir cümleyle kapsamlı bir sonuç çıkartan herkes, kendini aksi takdirde olduğundan daha sık yanlış bulur. Örneğin, bu durumda.
sds

4
Konu diller olduğundan, "boğazınızdan aşağı" terimi uygun ve uygun görüntülerdir.
luser droog

1
@KChaloux: Örnekte açıklandığı gibi "etkileyici" demek istedim.
sds

4
Hepsini geri aldın. Dinamik yazma, programcıyı her şey için 1 tür kullanmaya zorladığınız özel bir statik yazma durumudur. Aynı şeyi (verbosely), her değişkeni tür olarak Objectveya tür ağacının kökü ne olursa olsun bildirerek en statik olarak yazılan dillerde yapabilirim . Bu daha az sen çünkü, anlamlı yoksun bir seçeneği belirli değişkenler sadece belirli değerler içerebilir olduğunu söylemenin.
Doval

5

Yazılan Raket Haskell'den çok farklıdır. Lisp ve Scheme'deki tür sistemleri ve genel olarak geleneksel olarak türlenmemiş dil ekosistemlerindeki tür sistemleri, diğer tür sistemlerin varolan türlenmemiş kodla birlikte çalışmadığı temel bir amaca sahiptir . Örneğin Yazılı Raket, çeşitli Raket deyimlerini barındırmak için tamamen yeni yazım kuralları getirmiştir. Bu işlevi göz önünde bulundurun:

(define (first some-list)
  (if (empty? some-list)
      #f
      (car some-list)))

Boş olmayan listelerde bu, ilk öğeyi döndürür. Boş listelerde bu false değerini döndürür. Bu türlenmemiş dillerde yaygındır; yazılan bir dil Maybe, boş kutu gibi bir sarmalayıcı türü kullanır veya hata verir. Bu işleve bir tür eklemek istersek, hangi tür kullanılmalıdır? O değil [a] -> ao return false, çünkü (Haskell gösterimde). Ayrıca [a] -> Either a Boolean, (1) boş durumda her zaman false döndürür, keyfi bir boole değil ve (2) Her iki tür de öğeleri içeri Leftve yanlış Rightsarır ve gerçek öğeye ulaşmak için "ikisinden birini açmanızı" gerektirir. Bunun yerine, değeri döndürür gerçek birliği- ambalaj yapıcıları yoktur, bazı durumlarda sadece bir türü, diğer durumlarda başka bir türü döndürür. Yazılan Rakette, bu birleşim tipi yapıcı ile temsil edilir:

(: first (All (A) (-> (Listof A) (U A #f))))
(define (first some-list)
  (if (empty? some-list)
      #f
      (car some-list)))

Tür (U A #f), işlevin herhangi bir kaydırma Eitherörneği olmadan listenin bir öğesini veya false değerini döndürebileceğini belirtir . Tür denetleyicisi, some-listtür (Pair A (Listof A))veya boş listeden çıkarım yapabilir ve ayrıca if ifadesinin iki dalında bunlardan hangisinin durumun bilindiğini ihlal eder . Tür denetleyicisi (car some-list)ifadede listenin türün olması gerektiğini bilir, (Pair A (Listof A))çünkü if koşulu bunu sağlar. Buna oluşum yazma denir ve türlenmemiş koddan yazılan koda geçişi kolaylaştırmak için tasarlanmıştır.

Sorun göç. Orada bir ton türlenmemiş Raket kodu var ve Yazılan Raket, tüm favori türetilmemiş kütüphanelerinizden vazgeçmenize ve kullanmak istiyorsanız kod tabanınıza bir ay ekleyerek sizi zorlayamaz. Bu sorun , varolan bir kod tabanına türler yavaş yavaş eklediğinizde geçerlidir , bu fikirlerin javascript uygulaması için bkz. TypeScript ve Her Tür.

Aşamalı bir tür sistemi, ortak türlenmemiş deyimlerle başa çıkmak ve mevcut türsüz kodla etkileşim kurmak için araçlar sağlamalıdır. Aksi takdirde kullanmak oldukça acı verici olacaktır, Clojure örneği için "Neden artık Core.typed kullanmıyoruz" konusuna bakın .


1
Ekonomide bu, Gresham Yasası olarak bilinir : kötü para iyi olur. Mühendislikte de uygulama bulma eğilimindedir. Sisteminizde teorik olarak eşdeğer iki alt sisteminiz olduğunda, çoğu zaman daha kötüsü, burada gördüğümüz gibi, daha iyi olanı kullanmaya değecek çok fazla soruna neden olur.
Mason Wheeler

"bir tür sistem tasarlama örneği": bu cümle tam değil
coredump

@MasonWheeler Daha da kötüsü, tahmin edeyim, dinamik tip kontrolü. Peki tanıttığınız anda, bazı statik analizler yapmaya değmez mi?
coredump

1
@coredump - Türlenmemiş kodla zayıf bir şekilde etkileşime girmedikçe, kademeli yazma buna değer. TypeScript'teki Herhangi bir tür, örneğin daktilodan vazgeçmesini söyler, temel olarak tür sisteminin faydalarını dışarı atar, çünkü büyük miktarlarda statik olarak kontrol edilen kodda yayılmasına neden olabilir. Yazılan Raket, bu sorunu önlemek için sözleşmeler ve modül sınırları kullanır.
Jack,

1
@coredump Clojure makalesini okuyun. Özellikle statik türü olmayan tüm üçüncü taraf kodlarında dinamik yazarak, kod tabanlarını statik türlerle geliştirme girişimleri için gerçekten berbattı.
Mason Wheeler
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.