Il linguaggio di programmazione Haskell ha un concetto di newtypes
: Se scrivo newtype Foo = Foo (Bar)
, quindi un nuovo tipo di Foo
si crea che è isomorfo a Bar
, vale a dire ci sono conversioni biunivoche tra i due. Le proprietà di questo costrutto sono:lingue Cosa programmazione hanno qualcosa del tipo `newtype` Haskell
- I due tipi sono completamente separati (ovvero il compilatore non ti consente di usarne uno laddove l'altro è previsto, senza utilizzare le conversioni esplicite).
- Condividono la stessa rappresentazione. In particolare, le funzioni di conversione hanno un costo di runtime pari a zero e restituiscono "lo stesso oggetto" sull'heap.
- La conversione è possibile solo tra tali tipi e non può essere utilizzata in modo errato, ovvero la sicurezza del tipo viene mantenuta.
Quali altri linguaggi di programmazione forniscono questa funzionalità?
Un esempio sembra essere una struttura a valore singolo in C quando viene utilizzato solo con i programmi di accesso/costruttori di record. I candidati non validi sarebbero strutture a valore singolo in C se usati con i cast, poiché i cast non sono controllati dal compilatore o oggetti con un singolo membro in Java, poiché questi non condividono la stessa rappresentazione.
Domande correlate: Does F# have 'newtype' of Haskell? (No) e Does D have 'newtype'? (non più).
Non capisco la tua argomentazione sul motivo per cui le strutture a C con valore singolo non sono qualificate. Ovviamente se usi lanci perdi la sicurezza del tipo, ma non se usi solo i programmi di accesso e i costruttori del record (come fai anche tu in Haskell).E qualsiasi compilatore decente li integrerà in qualcosa di equivalente ai cast, proprio come fa GHC con 'newtype'. – leftaroundabout
leftroundabout: Hai un punto lì; ha modificato la mia domanda. –
@leftaroundabout La tua formulazione "qualsiasi compilatore decente" mi porta ad assumere che un compilatore C non è tenuto a farlo? – Ingo