Appendix A. Troubleshooting
This appendix details many of the problems commonly encountered by new F# programmers.
Value Restriction
One problem encountered when using an F# interactive session is the value restriction, which requires types to be completely defined.
The simplest example impeded by the value restriction is the definition of a reference to an empty list:
> let x = ref [];;
----^^stdin(2,4): error: FS0030: Value restriction.
Type inference has inferred the signature
val x : '_a list ref
Either define 'x' as a simple data term, make it afunction, or add a type constraint to instantiate the type parameters.
The empty list has the well-defined type 'a list but a reference to the empty list does not have a well-defined type because the empty list might be replaced by a non-empty list, in which case the elements must be of a specific type, the type of which has not been defined. In this case, the value restriction protects the programmer from accidentally setting the reference to an int list in one part of the program but a float list in another part of the program.
This problem can always be addressed by adding a type annotation to constrain the type of the value. In this case, we might know that the list will contain int values, so we annotate accordingly to make the F# interactive session happy:
> let x : int list ref = ref [];; val x : int list ref
The problem occurs mainly when executing parts of a program being developed in an F# interactive session.
MUTABLE ARRAY CONTENTS ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access