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.
