The below is not an example of a tuple, it is just that all type anontations must be surrounded by parenthesis.
let f (x:string) =
String.Format("Object x: {0} ",x)
So you could define f that takes 2 string arguments and can be called in the curried style:
> let f (x:string) (y:string) =
String.Format("Object x: {0} ",x),
String.Format("Object y: {0} ",y);;
I believe there is no difference between an expression that is surrounded by parenthesis one that isn't. Parenthesis are usally used to sort out precedence, but any expression can be replaced by the same expression surrounded by parenthesis.
Semi colon means chain two statements together. A statement is an expression that returns unit, which is F#'s version of void. Say you want to chain two Console.WriteLines together, you could either write:
> let write_stuff () =
let _ = Console.WriteLine("Hello") in
Console.WriteLine("World");;
val write_stuff : unit -> unit
Or more consisely:
> let write_stuff () =
Console.WriteLine("Hello");
Console.WriteLine("World");;
val write_stuff : unit -> unit
Robert Pickering, MVP
http://strangelights.com