type 'a Tree =
| Node of ('a Tree, 'a Tree)
| Leaf of 'a
Is saying "The possible cases for the type describing an 'a Tree are: a Node of two other 'a subtrees, or else a Leaf of an 'a."Then when you concrete-ize it, you have an "int Tree" or a "string Tree".
This is a little clearer with thinking of the List datatype: this is a number list, that's a string list, that's a grocery list, this is a guest list...etc.
One nice thing in F# is that there's an ability to "standardize" how you write generics to look more like the (admittedly arbitrary) way that C# or Java or C++ write them:
type Tree<'a> =
| Node of (Tree<'a>, Tree<'a>)
| Leaf of 'a