NA01
28-11-2005, 18:08
devo creare una funzione che prenda una lista e mi restituisca in una coppia l'ultimo elemento e la lista senza l'ultimo elemento.
la prima soluzione che ho scritto è questa:
let rec tail = function(l) -> (tuttaMenoUna(l),ultimo(l));;
let rec tuttaMenoUna = function [] -> []
|a::[] -> []
|a::b -> a::tuttaMenoUna(b);;
let rec ultimo = function a::[] -> a
|a::b -> ultimo(b)
a parte il fatto che si passa due volte la lista per risolvere il problema, c'è un problema ben più grave:
come segnala i compilatore il caso di un parametro lista vuota non è gestito, ed effettivamente in quel caso tira fuori cose senza alcun senso.
potrei mettere un caso vuoto che restituisce la coppia lista vuota e un valore a babbo (si era pensato a nan), ma in questo modo la funzione non prende più una a' list, ma una list di tipo ben fissato....
posso in qualche modo restituire un valore senza utilizzare eccezzioni o cose simili, e sopratutto senza andare a fissare il tipo della lista?
già che ci sono un'altra domanda, qualcuno sa in che campo è usato questo linguaggio (sempre che sia usato :D )?
ciao!
la prima soluzione che ho scritto è questa:
let rec tail = function(l) -> (tuttaMenoUna(l),ultimo(l));;
let rec tuttaMenoUna = function [] -> []
|a::[] -> []
|a::b -> a::tuttaMenoUna(b);;
let rec ultimo = function a::[] -> a
|a::b -> ultimo(b)
a parte il fatto che si passa due volte la lista per risolvere il problema, c'è un problema ben più grave:
come segnala i compilatore il caso di un parametro lista vuota non è gestito, ed effettivamente in quel caso tira fuori cose senza alcun senso.
potrei mettere un caso vuoto che restituisce la coppia lista vuota e un valore a babbo (si era pensato a nan), ma in questo modo la funzione non prende più una a' list, ma una list di tipo ben fissato....
posso in qualche modo restituire un valore senza utilizzare eccezzioni o cose simili, e sopratutto senza andare a fissare il tipo della lista?
già che ci sono un'altra domanda, qualcuno sa in che campo è usato questo linguaggio (sempre che sia usato :D )?
ciao!