Türler üzerinde aritmetik ayar yapmanıza izin veren programlama dilleri var mı?


9

Merak dışında, yeni türler oluşturmak için türlerde aritmetik ayarlamanıza izin veren diller var mı? Gibi bir şey:

interface A {
  void a();
  void b();
}

interface B {
  void b();
  void c();
}

interface C = A & B; // has b()
interface D = A | B; // has a(), b() and c()
interface E = (A & B) ^ B; // has c()

Bazı dillerde bu fikirlerin ifade edilebileceğini biliyorum (yani Java, List<Comparable & Serializable>arayüzlerin birleşmesi için var), ancak tip aritmetiği destekleyen bir dil duymadım. Teşekkürler!


7
Böyle bir mekanizma nasıl faydalı olur?
Robert Harvey

4
Çok gördüğüm bir desen, diğer iki arayüzü genişleten ve hiçbir şey eklemeyen (yani CanWriteAndCompare extends Serializable, Comparable {}) bir arayüz ve bunu nasıl genelleştireceğimizi düşünüyordum.
Haldean Brown

2
Ayrıca, bugün tam olarak aynı görünen iki uygulama ile bir Aveya bir yöntem alabileceğim bir durumla karşılaştım B. Metodda, bir Aveya a alabilen bir polimorfik metod çağırıyorum B, bu yüzden uygulamalar aynı, ancak iki farklı tip almak zorunda olduğum için iki uygulamaya ihtiyacım var. Yapabilseydim bu daha kolay olurdu myMethod(A | B aOrB).
Haldean Brown


1
Oroperasyon çoklu miras ile taklit edilebilir.
kullanıcı

Yanıtlar:


4

Teğet ( 0.3 spec ) buna benzer bir şey kullanır. (feragatname: bu benim kendi küçük araştırma projem)

Şu anda with, pragmatizm onu ​​değişmeli yapmadı, ancak miras modelleme bir sendika operatörü olarak hareket ediyor. Yöntemleri uygulamalara tanıttıktan sonra, aynı ada sahip katı bir yöntem birliği genellikle istediğiniz şey değildir ve yine de doğru yapmak imkansızdır.

intersectmodellerin foo(T,T)parametrelerin farklı olduğu yerler için çıkarım yazması desteklenir .

Tamamlayıcılar ilginçti, ancak doğru şekilde dahil edilmesi çok yararlı ve / veya zahmetli görünmeyen kısmi türlere yol açtı - bu yüzden dahil edilmedi.

Karşılaştığım, benzer bir şeye sahip ancak şu anda bunları hatırlayamayan birkaç araştırma dili olduğunu biliyorum. Asıl mesele, şeylerin çok popüler olmayan yapısal yazım olmadan gerçekten kullanışlı olmamasıdır. Diğeri ise, inşa edilen türü saklamak için bir çeşit türe (tür türü) ihtiyacınız var, yoksa bu yetenek olmadan özellikle deyimsel olmayan bir şey için sadece kestirme yol. Ve bu yapısal yazımdan bile daha az yaygındır.

Önyargılı ve fazla değil, ama işte burada.


5

Evet, Ceylon, Ceylon turunda bu bölümde açıklandığı gibi, geçici birleşim ve kavşak tiplerine sahip bir dildir:

http://ceylon-lang.org/documentation/1.0/tour/types/

Bundan elde ettiğiniz harika deyimlerin sayısı şaşırtıcı. İşte son zamanlarda blog yazdığım ilginç bir örnek . Ve burada birkaç basit deyime hızlıca parladığım kısa bir sunum .

Daha da iyisi, birleşim / kavşak türleri, genel tip argüman çıkarımının , alt tipi ve parametrik polimorfizmi birleştiren diğer diller yerine Ceylon'da gerçekten çalışmasını sağlayan "kayıp halka" dır.

Açıkladığınız gibi, bu tür bir "aritmetik" türünde sınırlamalar olduğunu unutmayın. Örneğin, tür düzeyinde bir tamamlayıcı operatörünüz olamaz, en azından kararsızlık getirmeden.

HTH


3

Scala bunu kısmen destekliyor (kavşaklar ama sendikalar değil) ve yapısal alt tiplemeli herhangi bir dil (bence OCaml bir örnek) veya taklit edecek kadar güçlü bir tip sistemi (Haskell klasik olanı) tam "set-as-setlerine sahip olacak "en azından bu tür şeyleri kabul eden tip sisteminin bir parçası içinde (ala HList / OOHaskell öykünmesi ile alakalı).

OCaml'ı çok iyi bilmediğim için, örneğinizin Scala'da çalışan kısmını vereceğim:

trait A {
  def a(): Unit
  def b(): Unit
}

abstract class B { // just to prove it works with both traits and classes
  def b(): Unit
  def c(): Unit
}

type C = A with B
type D = { def b(): Unit } // not an exact translation, because unions aren't directly available
// type `E` is unrepresentable

Haskell'in bir sürümü, kullandığınız kayıt sistemine bağlı olacaktır ve yerel olarak desteklenmektense taklit edileceğinden, muhtemelen biraz tıknaz olacaktır.

Bildiğim kadarıyla, Seylan, dilde tam güçle yerleşik kavşak ve birleşim tiplerine sahiptir , bu nedenle bunlar açısından bir tür-seviye "xor" kodlayabilirsiniz.


1

Java, bazı bağlamlarda arabirim türlerinin kesişimlerini destekler, ancak kavşak türlerinin değişkenlerinin oluşturulmasına izin verebildiğim kadarıyla değil. Örneğin ? :operatör kullanılırken kavşak türleri devreye girebilir . Bu operatörün ikinci ve üçüncü işlenenleri, çakışan arayüz kümelerinden miras kalan alakasız arayüzler ise, operatörün sonucu her ikisi için ortak olan arayüzler kümesi olacaktır.


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.