First we are able to redefine identifiers within functions by using the let keyword. This is useful when you want to have intermediate values which will not be referenced later, so there is no need to give them their own names.
Now lets look at type and scope:
Notice that when redefining a value using the let keyword, we are able change the type and value of the identifier. In the third line, valName is of type seq
Now lets look at the mutable Keyword. This keyword shows how F# can be used for imperative programming. We simply put the word mutable after let to define the identifier and then use the left arrow (<-) to change the value.
When using the mutable keyword, we are not able to change the type of the identifier, just the value. Notice the error in the next example.
Another important note about mutable identifiers is that you can not change the value of the identifier from within a subfunction. The following example demonstrates the scope error.
Hopefully this helps to clarify mutable vs immutable in F#.