pattern matching issue 
	 
	
		| Author | 
		Message | 
	 
		 
		Fonzie
 
 
 
    
		 | 
		
		
			
				  Posted: Mon Mar 02, 2009 6:48 pm    Post subject: pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				How do I match a pattern without assigning the variable I'm matching a new value? For example Let's say I want to make sure t is of the form Node (i,t1,t2), but then I want to leave t alone and do something else. So I guess I'm looking for a kind of if statement that can match patterns. 
 
 
	  | Ocaml: | 	 		  if t = Node (i,t1,t2) then
 
do some stuff
 
  | 	  
 
 
Is this possible? | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
		 
		Sponsor Sponsor 
		 
  
		 | 
		
 | 
	 
	 
		  | 
	 
				 
		wtd
 
 
 
    
		 | 
		
		
			
				  Posted: Mon Mar 02, 2009 7:12 pm    Post subject: RE:pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				| Language? | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		Fonzie
 
 
 
    
		 | 
		
		
			
				  Posted: Mon Mar 02, 2009 7:26 pm    Post subject: Re: pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				| ocaml | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		wtd
 
 
 
    
		 | 
		
		
			
				  Posted: Mon Mar 02, 2009 7:33 pm    Post subject: RE:pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
					  | code: | 	 		  match t with Node (i, t1, t2) -> blah ()  | 	 
  | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		Fonzie
 
 
 
    
		 | 
		
		
			
				  Posted: Mon Mar 02, 2009 7:48 pm    Post subject: Re: pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				| my problem with that though is that t is then assigned the value of blah(). I'm trying to find a way so that t is not assigned a new value. | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		wtd
 
 
 
    
		 | 
		
		
			
				  Posted: Mon Mar 02, 2009 7:57 pm    Post subject: RE:pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
					  | code: | 	 		  # type foo = Node of int * int * int;;
 
type foo = Node of int * int * int
 
# let t = Node (1, 2, 3);;
 
val t : foo = Node (1, 2, 3)
 
# match t with Node (a, b, c) -> t;;
 
- : foo = Node (1, 2, 3)
 
# t;;
 
- : foo = Node (1, 2, 3)
 
# 
 
  | 	 
  | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		Fonzie
 
 
 
    
		 | 
		
		
			
				  Posted: Mon Mar 02, 2009 8:14 pm    Post subject: Re: pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				But then can I use it as I previously mentioned? Let me show you in pseudo code what I'm trying to do.
 
 
	  | Ocaml: | 	 		   if t is of the form node (a,b,c) then
 
run a whole bunch of functions
 
else if t is of the form leaf (a) then
 
run a whole bunch of different functions  | 	  
 
 
I'm trying to Identify what type t is and take different steps depending on the type. | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		wtd
 
 
 
    
		 | 
		
		
			
				  Posted: Mon Mar 02, 2009 8:28 pm    Post subject: RE:pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
					  | code: | 	 		  # type 'a foo = Leaf | Node of 'a;;
 
type 'a foo = Leaf | Node of 'a
 
# let bar t =     
 
      match t with
 
          Leaf -> (print_string "A leaf!"; print_newline ())
 
        | Node n -> (print_string "A node!"; print_newline ());;
 
val bar : 'a foo -> unit = <fun>
 
# bar (Leaf);;
 
A leaf!
 
- : unit = ()
 
# bar (Node 4);;
 
A node!
 
- : unit = ()
 
# 
 
  | 	 
  | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
		 
		Sponsor Sponsor 
		 
  
		 | 
		
 | 
	 
	 
		  | 
	 
				 
		Fonzie
 
 
 
    
		 | 
		
		
			
				  Posted: Mon Mar 02, 2009 8:51 pm    Post subject: Re: pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				I think I've perhaps been communicating something wrong. Thank you for your patience and help up to this point. Here is my actual function.
 
 
	  | Ocaml: | 	 		  let rec sum t =
 match t  with
    Leaf i -> i
 
  | Node  (i, t1, t2 ) -> i +  (sum t1 ) +  (sum t2 );;
 let sum2 t =
 let rec loop previous instructions sum t =
 match t  with
Node  (i,t1,t2 )->
 if (List. hd instructions ) =  3 then
sum
 else if (List. hd instructions ) =  2 then
loop (t, 0:: (3::instructions ), sum+i, t1 )
else if (List. hd instructions ) =  0 then
loop (t, 0::instructions, sum+i, t1 )
else
loop (t, 1::instructions, sum+i, t2 )
|Leaf i ->
 if (List. hd instructions ) =  0 then
loop (t, 1:: (List. tl instructions ), sum+i, t )
else
loop (t, List. tl (List. tl instructions ), sum+i, t )
in 
loop t  [2] 0 t;;   | 	  
 
 
I'm getting type complaints from the compiler because sum and loop(t,0::(3::instructions), sum+i, t1) are different types I think. I'm just trying to find a way to verify type without getting complaints. | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		wtd
 
 
 
    
		 | 
		
		
			
				  Posted: Mon Mar 02, 2009 9:54 pm    Post subject: RE:pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				| Can you provide the type declaration? | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		Fonzie
 
 
 
    
		 | 
		
		
			
				  Posted: Mon Mar 02, 2009 10:04 pm    Post subject: Re: pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				sure thing
 
 
	  | Ocaml: | 	 		  type tree =
 
Leaf of int
 
| Node of int * tree * tree;;
 
  | 	 
  | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		wtd
 
 
 
    
		 | 
		
		
			
				  Posted: Mon Mar 02, 2009 10:36 pm    Post subject: RE:pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				First off, let's format that nicely.  Just because O'Caml has free-form syntax doesn't mean we need to be sloppy.
 
 
	  | code: | 	 		  type 'a tree =
 
    Leaf of 'a
 
  | Node of 'a * 'a tree * 'a tree
 
 
let rec sum (t : int tree) : int =
 
    match t with
 
        Leaf i -> i
 
      | Node (i, t1, t2) -> i + sum t1 + sum t2
 
 
let sum2 (t : int tree) : int =
 
    let rec loop previous instructions sum t =
 
        match t with
 
            Node (i, t1, t2)->
 
                match List.hd instructions with
 
                    3 -> sum
 
                  | 2 -> loop t (0 :: 3 :: instructions) (sum + i) t1
 
                  | 0 -> loop t (0 :: instructions) (sum + i) t1
 
                  | _ -> loop t (1 :: instructions) (sum + i) t2
 
          | Leaf i ->
 
                if List.hd instructions = 0 then
 
                    loop t (1 :: List.tl instructions) (sum + i) t
 
                else
 
                    let tl2 lst = List.tl (List.tl lst)
 
                    in
 
                        loop t (tl2 instructions) (sum + i) t
 
    in
 
        loop t [2] 0 t;;  | 	  
 
 
I've also added some type annotations to aid in figuring out where this is breaking. | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		wtd
 
 
 
    
		 | 
		
		
			
				  Posted: Mon Mar 02, 2009 11:04 pm    Post subject: RE:pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				Oops.
 
 
	  | code: | 	 		  type 'a tree =
 
    Leaf of 'a
 
  | Node of 'a * 'a tree * 'a tree
 
 
let rec sum (t : int tree) : int =
 
    match t with
 
        Leaf i -> i
 
      | Node (i, t1, t2) -> i + sum t1 + sum t2
 
 
let sum2 (t : int tree) : int =
 
    let rec loop previous instructions sum t =
 
        match t with
 
            Node (i, t1, t2) ->
 
                (match List.hd instructions with
 
                     3 -> sum
 
                   | 2 -> loop t (0 :: 3 :: instructions) (sum + i) t1
 
                   | 0 -> loop t (0 :: instructions) (sum + i) t1
 
                   | _ -> loop t (1 :: instructions) (sum + i) t2)
 
          | Leaf i ->
 
                if List.hd instructions = 0 then
 
                    loop t (1 :: List.tl instructions) (sum + i) t
 
                else
 
                    let tl2 lst = List.tl (List.tl lst)
 
                    in
 
                        loop t (tl2 instructions) (sum + i) t
 
    in
 
        loop t [2] 0 t;;  | 	 
  | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		Fonzie
 
 
 
    
		 | 
		
		
			
				  Posted: Tue Mar 03, 2009 8:20 pm    Post subject: Re: pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				| Alright, thank you very much for all the help you've given me. | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		wtd
 
 
 
    
		 | 
		
		
			
				  Posted: Tue Mar 03, 2009 9:00 pm    Post subject: RE:pattern matching issue  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				For what it's worth, a little bit different syntactic take on things.
 
 
	  | code: | 	 		  type 'a tree =
 
    Leaf of 'a
 
  | Node of 'a * 'a tree * 'a tree
 
 
let rec sum (t : int tree) : int =
 
    match t with
 
        Leaf i -> i
 
      | Node (i, t1, t2) -> i + sum t1 + sum t2
 
 
let sum2 (t : int tree) : int =
 
    let rec loop previous instructions sum t =
 
        let top_instruction = List.hd instructions 
 
        in
 
            match t with
 
                Node (i, t1, t2) when top_instruction = 3 -> sum
 
              | Node (i, t1, t2) when top_instruction = 2 -> 
 
                    loop t (0 :: 3 :: instructions) (sum + i) t1
 
              | Node (i, t1, t2) when top_instruction = 0 -> 
 
                    loop t (0 :: instructions) (sum + i) t1
 
              | Node (i, t1, t2) -> loop t (1 :: instructions) (sum + i) t2
 
              | Leaf i ->
 
                    if List.hd instructions = 0 then
 
                        loop t (1 :: List.tl instructions) (sum + i) t
 
                    else
 
                        let tl2 lst = List.tl (List.tl lst)
 
                        in
 
                            loop t (tl2 instructions) (sum + i) t
 
    in
 
        loop t [2] 0 t;;  | 	 
  | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		 | 
	 
 
	
	
	 
	
	 |