Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Ocaml] Problema in programmazione funzionale

    Ciao a tutti...
    Sono alle prese con questo strano linguaggio di programmazione (strano per me...)
    Praticamente ho 2 liste.. la prima di quadruple di int e la seconda di int...
    Dovrei creare una funzione che incrementi il terzo intero delle quadruple di indice contenuto nella seconda lista.... Quello che ho fatto finora è questo... (la funzione incriminata è sspush)...

    codice:
    let g1 = [(1,2,0,5);(2,3,0,3);(2,4,0,3);(2,5,0,5);(3,6,0,1);(5,6,0,2);(4,7,0,3)];;
    
    let push n = function 
    	(a,b,c,d) -> (a,b,c+n,d);;
    
    let rec spush n = function 
    	[] -> [] 
    	| x::xs -> (push n x)::(spush n xs);;
    
    let l1 = [1,3,5];;
    
    let rec sspush n l1 acc = function
    	[] -> []
    	| x::xs -> if (match l1 with [] -> false | y::ys -> (y=acc)) 
    		   then (push n x)::(sspush n (match l1 with [] -> [] | y::ys -> ys) acc+1 xs) 
    		   else sspush n l1 acc+1 xs;;
    Il prompt mi da' un errore sui tipi...
    Help

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Occhio che il separatore della lista è ; e non , (l1).
    In ogni caso se non dovesse essere l'unico problema questa funzione funziona (spush):
    codice:
    let g1 = [(1,2,0,5);(2,3,0,3);(2,4,0,3);(2,5,0,5);(3,6,0,1);(5,6,0,2);(4,7,0,3)];;
    
    let push n t = 
    	match t with
    		|(a,b,c,d) -> (a,b,c+n,d);;
    
    let l1 = [1;3;5];;
    
    let rec spush_aus n xss lss k =
    	match xss with
    		|x::xs -> 
    			(match lss with
    				|l::ls -> if l == k 
    						  then (push n x)::spush_aus n xs ls (k+1) 
    						  else x::spush_aus n xs (l::ls) (k+1)
    				|[] -> xs
    			)
    		|[] -> [];;
    
    let spush n xss lss = spush_aus n xss (List.sort compare lss) 0;;
    Se non dovessero esserci tutti gli elementi corrispondenti agli indici in lss questa funzione ritorna normalmente, puoi cambiare il suo operato modificando il match esterno di spush_aus; Inoltre considera come primo elemento l'elemento 0, per fare diversamente ti basta sostituire a 0 il numero che intendi considerare come numero di partenza (suppongo 1 nel caso) nell'ultima riga di codice...

    Devo dire che non sono molto soddisfatto di questo codice, ma era da due anni che non vedevo una riga di ocaml (e prima non l'avevo approfondito tantissimo) quindi prendilo come viene

    Devo inoltre aggiungere che questa soluzione non è tail recursive, quindi potrebbe provocare stack overflow su liste lunghe, ma puoi trasformarla in tale con un piccolo sforzo...

    Grazie perchè devi le discussioni del forum dai soliti linguaggi comuni (eg: C, C++...) a qualcosa che dia più soddisfazione!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Wow grazie mille!
    Qualcuno che se ne intende!!!!

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Nessun problema, per me è un piacere, anzi se dovessi avere problemi non esitare a chiedere!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.