C'e' un errore nella definizione. myPenultimo (x) | length x==1 =x | length x==2 =head x | otherwise = myPenultimo(tail x) In un caso la funzione restituisce x, in un altro head x. Quindi il codominio della funzione e' il tipo di x e di head x. Quindi x ed head x debbono avere lo stesso tipo. Poiche' ad x applichi head, il tipo di x deve essere una lista. Quindi un tipo della forma [T]. Se x ha tipo [T], allora head x ha tipo T. Poiche' , per quanto detto all'inizio, x e head x hanno lo stesso tipo, deve essere che T coincide con [T]. Impossibile! (a meno che T sia un tipo infinito). E comunque non restituisce il penultimo!!! Non funziona su [1], per esempio. myPenultimo (x) | (length x)==1 = head x | (length x)==2 = head x | otherwise = myPenultimo(tail x) Non e' possibile modificare la funzione per far restituire [] per l'input [], poiche' non si potrebbe tipare (restituirebbe una lista oppure un elemento a seconda dell'input). Si dovrebbe ricorrere alle monadi, ma per il nostro livello non e' banale farlo.