Strumenti Utente

Strumenti Sito


magistraleinformaticanetworking:spm:ocamlfs1

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Entrambe le parti precedenti la revisione Revisione precedente
Prossima revisione
Revisione precedente
magistraleinformaticanetworking:spm:ocamlfs1 [23/03/2011 alle 16:14 (13 anni fa)]
Marco Danelutto
magistraleinformaticanetworking:spm:ocamlfs1 [23/03/2011 alle 16:31 (13 anni fa)] (versione attuale)
Marco Danelutto
Linea 55: Linea 55:
 # farm (List.map sq) stream;; # farm (List.map sq) stream;;
 - : int list list = [[1; 4]; [9; 16]] - : int list list = [[1; 4]; [9; 16]]
 +
 +</code>
 +
 +This is a little bit ambiguous due to the usage of lists to represent both streams and arrays. 
 +Ocaml provides arrays as primitive types actually. Arrays are denoted similarly to lists using particular brackets:
 +<code>
 +# [|1;2|];;
 +- : int array = [|1; 2|]
 +
 +</code>
 +As for lists, a map working on arrays is pre-defined: 
 +<code>
 +# Array.map;;
 +- : ('a -> 'b) -> 'a array -> 'b array = <fun>
 +
 +</code>
 +Therefore we can re-write the //farm of map// example as follows:
 +<code>
 +
 +# let rec farm f x = 
 +  match (x) with 
 +  [] -> []
 +| listHead::listTail -> (f listHead)::(farm f listTail);;
 +      val farm : ('a -> 'b) -> 'a list -> 'b list = <fun>
 +# let sq x = x * x;; 
 +val sq : int -> int = <fun>
 +# let worker = Array.map sq;;
 +val worker : int array -> int array = <fun>
 +# let main = farm worker;;
 +val main : int array list -> int array list = <fun>
 +# let array1 = [| 1 ; 2 |];;
 +val array1 : int array = [|1; 2|]
 +# let array2 = [| 3; 4 |];;
 +val array2 : int array = [|3; 4|]
 +# let stream = [ array1; array2 ];;
 +val stream : int array list = [[|1; 2|]; [|3; 4|]]
 +# main stream;;
 +- : int array list = [[|1; 4|]; [|9; 16|]]
 +
 +</code>
 +
 +Even better, we can define our data type **stream** using the Ocaml type definition syntax: 
 +<code>
 +# type 'a stream = Empty | Stream of ('a * 'a stream);;
 +type 'a stream = Empty | Stream of ('a * 'a stream)
 +
 +</code>
 +The farm functional semantics may therefore be defined by the function: 
 +<code>
 +
 +  let rec farm f = function
 +    Empty -> Empty
 +  | Stream(x,y) -> Stream ((f x), (farm f y));;
 +val farm : ('a -> 'b) -> 'a stream -> 'b stream = <fun>
 +
 +</code>
 +Therefore the type of our //farm of map// will be correctly inferred as: 
 +<code>
 +# farm (Array.map sq);;
 +- : int array stream -> int array stream = <fun>
  
 </code> </code>
  
magistraleinformaticanetworking/spm/ocamlfs1.1300896874.txt.gz · Ultima modifica: 23/03/2011 alle 16:14 (13 anni fa) da Marco Danelutto