2012-03-17 16 views
5

Esiste un modo per ottenere controlli statici sugli array Haskell? Prendiamo questo codice:Controlli dei limiti statici sugli array Haskell

import Data.Array 
let a = listArray (0, 10) [-3.969683028665376e+01, 2.209460984245205e+02, -2.759285104469687e+02, 1.383577518672690e+02, -3.066479806614716e+01, 2.506628277459239e+00] 

(0, 10) in realtà dovrebbe essere (0, 5), ma il compilatore accetta il codice. L'errore viene rilevato solo in fase di esecuzione, nonostante possa essere rilevato in fase di compilazione.

+2

Forse potrebbe essere rilevato * in questo caso * - ** se ** il compilatore esegue molte inlining e piegature costanti per raggiungere una chiamata 'error' (o qualunque) incondizionata. Nella maggior parte dei programmi non banali, non può essere rilevato, almeno non con uno sforzo ragionevole. E poi c'è questo fastidioso problema di interruzione ... – delnan

+0

Utilizzare [Abitudine] (http://hasp.cs.pdx.edu/habit-report-Nov2010.pdf) (PDF) Tipi Ix per ottenere una garanzia statica di limiti. Punti bonus se porti questo lavoro a Haskell. –

+0

C'è un modo, ma è troppo scomodo per essere pratico. Per ulteriori informazioni, prova a cercare nel Web "haskell dei numeri a livello di testo". –

risposta

7

Questo non può essere rilevato in fase di compilazione, perché non c'è nulla nel tipo di lista che salva le sue dimensioni, quindi la funzionenon può eseguire tali controlli. Inoltre, se i dati provengono da un file esterno (ad esempio), sarebbe molto difficile far funzionare la verifica delle dimensioni statiche.

È necessario un sistema di tipo dipendente come quello che si trova in Agda per cose come questa possibile.

+0

Ciò che viene creato non è un elenco, ma un array (Data.Array). –

+0

Sì, ma si sta utilizzando un elenco per creare l'array. Tu fai 'listArray (start, end) someList'. – dflemstr

+0

Ma in questo pezzo di codice, 'someList' viene presentato esplicitamente al compilatore, in modo che possa eseguire facilmente il controllo. Ma penso di capirlo adesso: Data.Array non è un tipo Haskell nativo. –