Problem - podobnie jak wiele innych, gdy uczysz się Haskell - jest jednym z pisania. Wpisz następujące polecenie w GHCi
:t mylast
, a zobaczysz, że podpis typ jest
mylast :: [[a]] -> [a]
który oczekuje listę list i zwróci listę. Więc jeśli umieścisz listę łańcuchów ["bob", "ogrodzenie", "dom"] funkcja zadziała tak, jak ją napisałeś.
Problem to Twój podstawowy przypadek: mylast [] = [], który mówi kompilatorowi, że chcesz zwrócić listę. Chcesz zwrócić element, a nie listę. Ale nie ma pustego elementu w Haskell (bardzo dużo według projektu), więc musisz użyć Monady Być może.
mylast :: [a] -> Maybe a
mylast [] = Nothing
mylast (x:[]) = Just x
mylast (x:xs) = mylast xs
Monady są nieco abstrakcyjnym tematem, ale potrzebujesz Monady, kiedy zaczynasz. Wszystko, co musisz wiedzieć o tym, to deklaracja typu, która mówi kompilatorowi, aby oczekiwał dwóch możliwości: "Nic" lub "Just x". Zwracający kod może następnie wziąć x i uruchomić z nim, ale jeśli zostawisz "Just", kompilator będzie narzekał.
Alternatywą jest wyrzucić błąd, gdy lista jest pusta napotkanych tak:
mynextlast [] = error "no empty lists allowed"
mynextlast (x:[]) = x
mynextlast (x:xs) = mynextlast xs
Ale moje podejrzenie, że może to jest droga.
Należy przyjąć rtperson odpowiedź ... – yeyeyerman