A tuple is a grouping of unnamed, ordered values. Each value in a tuple does not have to be of the same type, which means that you can have a tuple defined as:
let someTuple = (1, "foo", 42.3)
This will create a tuple containing the value of int, string and float.
A list is an ordered set of values of the same type that is immutable. This is probably the most common type of collection used in functional programming, since it is completely unchanged and has many functions for creating lists created on top of previously created lists, which allows you to create collections that "grow" (they are actually new collections, however, as lists are immutable).
An array is a modified collection. They are very effective for creation, but must always be of the same type.
Is it easy to convert between them if necessary?
It is very easy to convert between lists and arrays. You can use List.ofArray , List.toArray , Array.ofList and Array.toList to convert between types.
Converting from a tuple to an array or list is not common, and not always possible, because tuples allow you to store several types in it.
They seem similar in spirit, so I really need to know what allows me to understand when to use one against the other?
Lists and arrays are used for collections. In general, you will want to give preference to lists if you intend to create lists that "grow", since creating a new list consisting of the + element, the original list is much more efficient than the same with the array.
Arrays are often used for better performance scenarios (they have better memory locality, more economical places, etc.), but they are mutable and fixed, so they are often not ideal when you try to work with building collections.
Tuples are commonly used for completely different scenarios. The most common use case for tuples is to pass in multiple elements as a single value. This happens automatically when using infrastructure methods that have out parameters, for example, so you will see usage examples, such as:
let (success, value) = int.TryParse(someString)
In this case, a tuple is automatically created, and then the template is matched to retrieve the values in a single line of code. Instead of thinking of a tuple as a “collection”, it is rather a way to hold several values, often of different types, together.