Toplam türleri - Haskell'de neden `` show (Int | Double) '' (show Int) | (Çift göster) `


9

Bunlar neden eşdeğer değil?

show $ if someCondition then someInt else some double

ve

if someCondition then show someInt else show someDouble

if ... elseİlk örnekteki parçayı kendi başına bir ifadeye ayırırsanız , türünü anonim bir toplam türüyle, türünü, Int | DoubleTypeScript'te kolayca yapabileceğiniz bir şey gibi temsil edemeyeceğinizi anlıyorum ( langauge Sık kullandım ve Sum türlerini destekliyor) ve daha Eithersonra buna dayanarak verileri kullanarak başvurmak zorunda kalacaktık show.

Burada verdiğim örnek önemsiz ama benim için "Tamam bir şey göstereceğiz, ve" bir şey someCondition"yerine" Tamam, eğer bir koşul doğruysa o zaman someInt, aksi takdirde someDouble göster " i düşünmek daha mantıklı ve aynı zamanda daha az kod çoğaltma için (burada gösteri iki kez tekrarlanır, ancak aynı zamanda uzun bir işlev uygulaması olabilir ve yerine if ... else> 2 dal düşünülebilir)

Benim düşünceme göre, derleyicinin toplam türünü (burada Int | Double) yapan türlerin her birinin showişlev için bir parametre olarak kullanılıp kullanılamayacağını kontrol etmesi kolay olmalı ve türlerin doğru olup olmadığına karar vermelidir . Daha da iyisi, showfonksiyon her zaman stringparametre türleri ne olursa olsun döndürür , bu yüzden derleyici tüm olası "dalları" (yani tüm olası türleri) taşımak zorunda değildir.

Böyle bir özellik mevcut değil mi? Yoksa uygulamak bence zor mu?


2
Bir if ... then ... else ..., thenve elsebölümünde aynı türde olmalıdır . Bazı programlama dillerinde üçlü bir operatör olarak görebilirsiniz.
Willem Van Onsem

1
Kabul ediyorum making all conversions explicit. Benim sorum, Haskell'in Intbir Doubleveya tam tersini yapmasını istemiyorum . Bu iki türü sadece örnek olarak kullandım. Her yerini alabilecek Intolan ave Doublebirlikte bher iki tür de türetmek benim söz konusu Show. anonymous sum typesHaskell'de hiç olmadığını anlıyorum, ancak bunun neden böyle olduğunu ve bunu yapmak için dili tasarlamamızı neyin engellediğini bilmek istiyorum.
Mehdi Saffar

4
Bence bu tiplere sendika tipi deniyor . Toplam türü temel olarak birleşim türünün etiketli bir çeşididir, burada her bir değer iç türün değerinin ötesinde bir sol / sağ etiket taşımalıdır. Haskell'in tüm tip seviyesi özelliklerine sahip sendika tipleriyle bu tür çıkarımların elde edilmesini çok zor bekliyorum. Eğer x :: Int | Boolbiz derlemek zorunda show x, işaretçi işleve çağırarak için hangi bilmek kolay bir yolu yoktur showtip-silme bazlı RTS içinde. Muhtemelen çalışma zamanında bazı tür düzeyinde bilgileri tutmamız gerekir.
chi

1
İsimsiz toplam türlerinin olmaması Haskell tasarımcılarının tasarım kararıdır. Masaya ne tür bir fayda getireceklerinden pek emin değilim, biraz da işleri nasıl karmaşıklaştıracaklarını görüyorum. Benim tahminim dışarıda kalmalarıdır çünkü maliyet / fayda oranı orada değildir. Ancak, orijinal dil tasarımcılarına ve / veya mevcut uzmanlara sormanız gerektiğinden kesinlikle emin olmak için. Bunun büyük bir SO sorusu olacağını sanmıyorum, çünkü bir dil tasarlamada çok fazla kişisel görüş ve zevk var.
n. 'zamirler' m.

4
(String, Int)anonim değil. Sadece komik sözdizimi ile düzenli bir ürün türüdür. (String | Int)çok farklı olurdu. Kendinize (Int|Int)aynı olup olmayacağını Intve nedeninin ne olduğunu sormakla başlayın .
n. 'zamirler' m.

Yanıtlar:


8

Bir ifadenin tüm bölümleri iyi yazılmalıdır. Türü if someCondition then someInt else someDoublegibi bir şey olmalı exists a. Show a => a, ama Haskell bu tür varoluşsal niceliği desteklemiyor.

Güncelleme: Chi'nin bir yorumda belirttiği gibi , Haskell'in sendika / kavşak tiplerine (toplam / ürün tipleriyle aynı olmayan) destek vermesi de mümkündür, ancak maalesef bu mümkün değildir.


Birleşim / kavşak tipleri ile toplam / ürün tipleri arasındaki farkı açıklar mısınız? Anonimlik dışında her zaman aynı olduklarını düşündüm.
Mehdi Saffar

1
@MehdiSaffar Adsız bir kurucuda olduğu gibi etiketsiz olarak anonim. Başka bir deyişle, eğer bir tane varsa Int ∪ Double, o zaman ikisinden birine sahip olduğunuzu bilirsiniz, ancak hangisini görmek için desen eşleşmesi mümkün olmaz, böylece sadece her iki olasılık için de geçerli olacak şeyleri yapabilirsiniz.
Joseph Sible-Reinstate Monica

2
Netlik açısından, TypeScript çalışma zamanında tür bilgisine sahiptir, bu nedenle typeofetiketleme eksikliğini telafi edebilecek ve yine de hangi türün kullanıldığını görebilecek bir operatöre sahiptir . Haskell tamamen türden silinir, bu nedenle bu özelliği destekleseydi buna eşdeğer olmazdı.
Joseph Sible-Reinstate Monica

7

(,)Haskell'de yazılı , hafif sözdizimine sahip ürün türleri vardır . Biri, hafif bir sözdizimine sahip bir toplam türünün, gibi bir şeyin (Int | String)harika bir fikir olacağı şeydir. Gerçeklik daha karmaşıktır. Bakalım neden (bazı özgürlükler alıyorum Num, önemli değiller).

if someCondition then 42 else "helloWorld"

Bu tür bir değer (Int | String)döndürürse, aşağıdaki döndürme ne olmalıdır?

if someCondition then 42 else 0

(Int | Int)Açıkçası, ama eğer ovadan farklıysa, Into zaman çok sorun yaşıyoruz. Yani (Int | Int)ova ile aynı olmalıdır Int.

Bunun, toplam türleri için sadece hafif bir sözdizimi değil, tamamen yeni bir dil özelliği olduğunu hemen görebilirsiniz. İsterseniz farklı bir tür sistem. Bir tane almalı mıyız?

Bu işleve bakalım.

mysteryType x a b = if x then a else b

Şimdi ne tür mysteryTypevar? belli ki

mysteryType :: Bool -> a -> b -> (a|b)

sağ? Şimdi ya aynı tip ave eğer b?

let x = mysteryType True 42 0

Bu açık olmalı IntDaha önce anlaştığımız gibi . Şimdi mysteryTypebazen anonim bir toplam türü döndürür ve bazen hangi argümanları ilettiğinize bağlı olarak döndürmez. Böyle bir ifadeyle nasıl eşleşirsiniz? Onunla ne yapabilirsin? "Gösteri" gibi önemsiz şeyler (veya bunun bir örneği olacak diğer tür sınıflandırma yöntemleri) hariç, bir sürü değil. Dile çalışma zamanı türü bilgileri eklemediğiniz sürece, yani typeofkullanılabilir - ve bu da Haskell'i tamamen farklı bir dil haline getirir .

Yani evet. Haskell neden bir TypeScript değil? Çünkü başka bir TypeScript'e ihtiyacımız yok. TypeScript istiyorsanız, nerede bulacağınızı bilirsiniz.


1
@MichaWiedenmann Açıkçası “alakalı” kelimesinin doğru olup olmadığını bilmiyorum. Ben bir şekilde ya da başka bir şekilde yardımcı olduğunu düşünüyorum. Evet bir an durdum ve ekleyip eklememeyi düşündüm. Ama zaman zaman yanıldığım biliniyor.
n. 'zamirler' m.

Sorun değil, bu sizin yazınız, siz karar verin.
Micha Wiedenmann

Peki zamirleriniz nedir?
dfeuer
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.