Esistono linguaggi di programmazione che ti consentono di eseguire l'aritmetica sui tipi?

9

Per curiosità, ci sono linguaggi che ti consentono di impostare l'aritmetica sui tipi per creare nuovi tipi? Qualcosa come:

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()

So che in alcune lingue queste idee possono essere espresse (vale a dire, Java ha List<Comparable & Serializable> per l'unione delle interfacce) ma non ho mai sentito parlare di un linguaggio che supporti l'aritmetica dei tipi. Grazie!

    
posta Haldean Brown 21.11.2012 - 01:29
fonte

5 risposte

4

Tangente ( 0.3 spec ) utilizza qualcosa di simile a questo. (disclaimer: questo è il mio piccolo progetto di ricerca)

Attualmente with agisce come un sindacato che modella l'ereditarietà, sebbene il pragmatismo lo abbia reso non commutativo. Una volta introdotte le implementazioni sui metodi, una stretta unione di metodi con lo stesso nome spesso non è ciò che si desidera e impossibile da fare comunque.

intersect è supportato dall'inferenza del tipo di modelli per qualcosa come foo(T,T) in cui i parametri sono diversi.

I complementi erano interessanti, ma portavano a tipi parziali che non sembravano così utili e / o problematici da includere correttamente, quindi non sono inclusi.

So che ci sono altri linguaggi di ricerca in cui ho trovato qualcosa di simile, ma al momento non riesco a ricordarli. Il problema principale è che le cose non sono veramente utili senza la tipizzazione strutturale, che non è molto popolare in sé. L'altro è che è necessario un tipo di tipo (tipo di tipi) per memorizzare il tipo costruito, oppure è semplicemente una scorciatoia per qualcosa che non è particolarmente idiomatico senza quella capacità. E questo è molto meno comune della tipizzazione strutturale.

È di parte, e non è molto, ma è così.

    
risposta data 21.11.2012 - 02:25
fonte
5

Sì, Ceylon è una lingua con tipi di unione e intersezione ad hoc, come descritto in questo capitolo del tour di Ceylon:

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

È incredibile il numero di idiomi fantastici che ottieni da questo. Ecco un esempio interessante che ho scritto di recente . Ed ecco una breve presentazione in cui riporto rapidamente alcuni semplici idiomi .

Ancora meglio, i tipi di unione / intersezione sono il "collegamento mancante" che rende l'inferenza degli argomenti di tipo generico veramente funzionante in Ceylon rispetto ad altri linguaggi che combinano sottotipo e polimorfismo parametrico.

Si noti che esistono limitazioni a questo tipo di "tipo aritmetico", come lo hai descritto. Ad esempio, non puoi avere un operatore del complemento del set a livello di testo, almeno non senza introdurre l'indecidibilità.

HTH

    
risposta data 29.01.2014 - 01:10
fonte
3

Scala lo supporta parzialmente (intersezioni ma non unioni), e qualsiasi linguaggio con sottotipizzazione strutturale (penso che OCaml sia un esempio) o un sistema di tipi abbastanza potente da emulare che (Haskell è un classico) avrà "tipi" completi as-sets ", almeno all'interno del frammento del suo sistema di tipi che accetta tali cose (rilevante quando è emulato ala HList / OOHaskell).

Dato che non conosco molto bene OCaml, darò la porzione del tuo esempio che funziona in Scala:

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

Una versione per Haskell dipenderebbe dal sistema di registrazione che stavi usando, e probabilmente sarebbe un po 'goffo, perché sarebbe emulata piuttosto che supportata in modo nativo.

Per quanto ne so, Ceylon ha entrambi i tipi di unione di intersezione e incorporati nella lingua in pieno potere, quindi potresti presumibilmente codificare un "xor" di livello di tipo in termini di quelli.

    
risposta data 21.11.2012 - 02:44
fonte
1

Java supporta intersezioni di tipi di interfaccia in alcuni contesti, anche se non per quanto posso dire di consentire la creazione di variabili di tipi di intersezione. I tipi di intersezione possono entrare in gioco, ad esempio, quando si utilizza l'operatore ? : . Se il secondo e il terzo operandi di quell'operatore sono interfacce non correlate che ereditano da insiemi sovrapposti di interfacce, il risultato dell'operatore sarà l'insieme di interfacce comuni a entrambi.

    
risposta data 29.09.2014 - 01:12
fonte
0

Common Lisp ti permette di definire il nuovo tipo usando not , and e or operatori (vedi digita specificatori che combinano ).

    
risposta data 29.09.2014 - 08:38
fonte

Leggi altre domande sui tag