Il problema - come tanti altri quando stai imparando Haskell - è quello della digitazione. Digitare quanto segue in GHCi
:t mylast
e vedrete che la firma tipo è
mylast :: [[a]] -> [a]
che si aspetta una lista di liste e restituirà un elenco. Quindi se inserisci un elenco di stringhe ["bob", "fence", "house"] la funzione funzionerà come hai scritto tu.
Il problema è il caso base: mylast [] = [], che indica al compilatore che si desidera restituire un elenco. Vuoi restituire un elemento, non una lista. Ma non c'è alcun elemento vuoto in Haskell (molto di design), quindi è necessario usare la Forse monade.
mylast :: [a] -> Maybe a
mylast [] = Nothing
mylast (x:[]) = Just x
mylast (x:xs) = mylast xs
Le Monade sono un argomento un po 'astratto, ma hai bisogno della monade Forse quando inizi. Tutto quello che devi sapere è che è una dichiarazione di tipo che dice al compilatore di aspettarsi due possibilità: "Niente" o "Solo x". Il codice restituito può quindi prendere x e correre con esso, ma se si omette "Just", il compilatore si lamenterà.
L'alternativa è quella di lanciare un errore quando si incontra un elenco vuoto, in questo modo:
mynextlast [] = error "no empty lists allowed"
mynextlast (x:[]) = x
mynextlast (x:xs) = mynextlast xs
Ma il mio sospetto è che forse è la strada da percorrere.
Dovreste accettare risposta rtperson ... – yeyeyerman