Quali linguaggi procedurali supportano i tipi di dati algebrici? [chiuso]

2

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?

    
posta John DeHope 30.06.2014 - 17:38
fonte

3 risposte

2

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.

    
risposta data 01.07.2014 - 03:30
fonte
3

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.

    
risposta data 30.06.2014 - 20:20
fonte
1

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 .

    
risposta data 30.06.2014 - 20:25
fonte

Leggi altre domande sui tag