2009-08-01 1 views
13

Nello spirito degli altri errori comuni nelle domande, quali sono gli errori più comuni commessi dai programmatori Haskell? Ho insegnato a me stesso Haskell per un po 'e sto iniziando a sentirmi abbastanza a mio agio con il linguaggio per iniziare ad applicarlo nel mondo reale.Errori di programmazione comuni da evitare per gli sviluppatori Haskell?

+1

E un altro dovrebbe essere-community-wiki ... – chaos

+0

Questo tipo di domanda è generalmente più apprezzato come Wiki della comunità. – zombat

+0

È difficile immaginare perché questo non sia "una vera domanda" quando ci sono così tante altre "domande comuni di errori di programmazione" su SO che sono sopravvissute. –

risposta

15

L'errore più comune che conosco è l'introduzione di una perdita di spazio attraverso la valutazione lenta. Ci sono molti modi per ottenere questo errore, ma uno che in particolare inchioda i programmatori con altre esperienze di programmazione funzionale è di mettere un risultato in un parametro di accumulo, pensando che il parametro di accumulo avrà uno spazio costante. In molti casi il parametro di accumulo prende lo spazio lineare perché i parametri non vengono valutati.

Un altro errore comune è dimenticare che let è sempre ricorsivo. Un involontario

let x = ... x ... 

può portare a sconcertante risultati.

La maggior parte delle altre cattive esperienze comuni si manifestano non come errori ma come problemi nel far passare i programmi oltre il controllo del tipo o difficoltà nel comprendere il modello di I/O monadico. Le difficoltà con le list comprehensions e con le notazioni do si verificano occasionalmente.

In generale, le difficoltà incontrate dai programmatori inesperti Haskell includono

  • Grande linguaggio con molti angoli bui, in particolare nel sistema di tipo
  • programmi difficoltà a compilare, in particolare quando lo fanno di I/O
  • Esegui tutto nella IO monad
  • Grande difficoltà nella previsione del tempo e dello spazio dei programmi funzionali pigri
8

Un errore comune per all'inizio I programmatori Haskell sono a forget the difference between constructor and type namespaces. È stato un errore del principiante che mi vergogno di avere il mio nome in allegato, ma sono abbastanza fiducioso che altri si imbatteranno in questa risposta quando hanno un problema simile, quindi potrebbe anche tenerlo fuori.

4

La differenza tra [] e [[]]: la lista vuota e l'elenco con 1 elemento, ovvero la lista vuota. Questo in particolare si apre nei casi base di funzioni ricorsive.

-1

Utilizzare le funzioni non ricorsive della coda o le pieghe non rigide che si verificano per impilare lo straripamento.

+2

Questo è meno vero in Haskell rispetto ad altri linguaggi funzionali. Un sacco di tempo, la pigrizia rende la versione non-tail delle funzioni una scelta migliore (ad esempio puoi 'foldr' una lista infinita, mentre la' foldl' ricorsiva in coda esploderà ogni volta). – Chuck

+1

Lo so, ma head (x: xs) = head xs + 1 non esploderà su un elenco di 1000000 articoli? – Hai

+0

Ho provato 'testa '' (x: xs) = lascia x '= testa' 'xs in x' \' seq \ 'x '+ 1', senza successo. Qualcuno ha qualche indizio? – ScootyPuff

-1

La nozione di un'espressione è abbastanza confusa per i principianti. Prendi il costrutto condizionale nei linguaggi di programmazione imperativi. Esiste solo un costrutto, ma in Haskell è un'espressione. Quindi un condizionale se deve avere un altro corrispondente ed entrambi devono produrre valori dello stesso tipo di valutazione.

wrongFunc n = if n > 18 
       then 1 
       else False 

Il blocco if si trasforma in un numero intero in cui il resto restituisce un valore bool. Questo è un errore comune poiché in Haskell non sono solo blocchi di istruzioni ma espressioni.

+3

Non vedo perché questo sia confuso e sono un po 'un principiante di Haskell. Confronta la stessa cosa in un linguaggio simile a C: avresti dei ritorni espliciti, ma il tipo restituito dovrebbe essere int o bool e sarebbe un errore restituire 1 o false a seconda del valore dell'argomento. – Zak