Qual è la differenza tra tipizzazione dipendente e contratti?

5

Qual è la differenza tra lingue digitate dipendenti e lingue come Spec # e Eiffel che consentono di specificare "contratti" per le funzioni nel codice per pre / post-condizioni? Dipende essenzialmente dalla tipizzazione della versione puramente funzionale dei "contratti" di Eiffel?

Da quanto ho capito, lingue tipizzate in modo dipendente ti consentono di specificare le funzioni della tua funzione pre e post condizioni utilizzando la logica dei predicati come parte del tipo.

Il concetto di contratti di Eiffel sembra essere simile, ma basato sulla programmazione imperativa, non sulla programmazione funzionale.

    
posta Nathan BeDell 22.02.2014 - 20:54
fonte

3 risposte

1

La digitazione dipendente (completa) consente di scrivere espressioni ematiche a livello di tipo comprese quelle che, in un linguaggio più "mainstream", sarebbero esclusive del livello di valore. Questo ti consente di scrivere condizioni pre e post-testate per le tue funzioni, ma solo come caso speciale di poter scrivere qualsiasi cosa ti piaccia .

Al contrario, i "contratti" possono solo fare un controllo molto specifico, al contrario di controllare letteralmente tutto ciò che puoi concepire (purché sia calcolabile).

I cosiddetti "tipi di raffinatezza" rientrano da qualche parte nel mezzo.

    
risposta data 23.02.2014 - 10:17
fonte
2

Una differenza importante che non è stata menzionata esplicitamente finora, è che i tipi dipendenti sono controllati in fase di controllo del tipo (duh!), cioè staticamente, prima del runtime. I contratti di Eiffel sono controllati dinamicamente, in fase di esecuzione. Spec # cade da qualche parte nel mezzo: i contratti sono controllati dinamicamente, in fase di esecuzione, ma è possibile ottenere un dimostratore di teoremi che può (provare a) dimostrare (alcuni) contratti staticamente, prima del runtime.

    
risposta data 23.02.2014 - 14:26
fonte
-5

I contratti dovrebbero sempre essere espressi in modo funzionale, senza effetti collaterali. Sono agnostici linguistici in quanto tali. Esistono librerie ed estensioni di contratti per linguaggi come schema, java, c # e haskell. Sono molto espressivi ma raramente controllati staticamente.

I tipi dipendenti, d'altra parte, sono spesso meno espressivi e, a mia conoscenza, sono sempre controllati staticamente.

Il mio punto con questo post è di respingere l'idea che i contratti siano limitati a lingue imperative.

    
risposta data 22.02.2014 - 21:21
fonte

Leggi altre domande sui tag