Una delle cose che mi piace del nuovo linguaggio Apple Swift è che combina la programmazione procedurale con tipi di dati algebrici. Quali altri linguaggi fanno questo?
Una delle cose che mi piace del nuovo linguaggio Apple Swift è che combina la programmazione procedurale con tipi di dati algebrici. Quali altri linguaggi fanno questo?
Famiglia ML: OCaml, SML, F #
ML era (AFAIK) la prima lingua a supportare direttamente i tipi di dati algebrici; ML e i suoi discendenti hanno sempre almeno uno stato mutabile attraverso variabili di riferimento.
Racket
All'interno della famiglia Racket c'è #lang plai
che fornisce direttamente tipi algebrici.
#lang racket
supporta lo stesso stile di programma che utilizza più sottotipi di un tipo di struttura e utilizza la macro match
. C'è un bel discorso sulla relazione tra tipi algebrici e questo design in questo talk , parte del Brown corso PL online.
Il racket digitato fornisce tipi di unione e corrispondenza espliciti attraverso la macro match
.
Scala
Le classi di casi di Scala sono tipi algebrici costruiti sopra il sistema di classi della JVM.
Altri
Wikipedia ha un elenco di lingue con tipi di dati algebrici ; le lingue in questa lista con la mutabilità includono Nemerle e haXe.
Ho unito le corrispondenze alle operazioni di stile con i tipi di dati algebrici qui, in parte perché la praticità è davvero tutto ciò che separa alcuni di questi linguaggi dall'assemblaggio; puoi definire tipi algebrici ad-hoc in qualsiasi lingua tu voglia, semplicemente non sarà molto bello.
Puoi essere completamente imperativo nelle lingue della famiglia ML (ad es. Ocaml) mentre godendo di ADT e pattern matching.
Puoi avere un tipo di ADT in discendenti di algol come C e Pascal usando record delle varianti . Ma otterrai pochissimo zucchero sintattico. Dovrai impacchettare / disimballare e controllare le varianti manualmente, senza la sicurezza di tipo statico che, ad es. Haskell ti avrebbe dato.
Java / C # non supporta ADTs out of the box ma con alcuni caratteri standard e lambda puoi rimuoverlo .
Se non sbaglio, è anche più o meno quello che sono le case classes di Scala, meno il boilerplate .
Leggi altre domande sui tag procedural algebraic-data-type