|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
[caml] ritornare elemento inesistente
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: Codice:
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) 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 ![]() ciao! |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
upete!
![]() |
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Non posso darti una soluzione in ocaml perche' non lo conosco.
Essendo un dialetto ML, dovrebbe avere pero' una struttura dati simile alla option di SML, che funziona al seguente modo: un dato di tipo 'a option' puo' valere NONE , oppure SOME x , con x di tipo 'a. Nel tuo caso quindi dovresti cambiare la funzione in modo che ritorni "SOME x" in caso la lista sia non vuota, e NONE altrimenti. In alternativa puoi usare un'altra lista, che sara' vuota nel caso la lista originale sia vuota, e sia invece una lista di un solo elemento altrimenti. Per evitare la doppia scansione puoi "spezzare" il risultato della chiamata ricorsiva, ritornando sempre l'eventuale valore ritornato, e usando la lista parziale per ricostruire la finale. Ti mostro un esempio con notazione Haskell, che pero' dovresti riuscire a capire comunque: Codice:
tail :: [a] -> ([a],[a]) tail [] = ([],[]) tail [x] = ([],[x]) tail (x:xs) = let (testa,coda) = tail xs in (x:testa,coda) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:49.