Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Post History
Paraphrasing the F# language guide's let Bindings in Classes article: A let binding in a class creates a private field or function; to expose data or functions publicly, declare a property or a...
Answer
#1: Initial revision
Paraphrasing the F# language guide's [`let` Bindings in Classes][1] article: > A **`let` binding** in a class creates a *private* field or function; > to expose data or functions publicly, declare a property or a member > method. > > + An **instance `let` binding** is a `let` binding that is not preceded by the `static` keyword. > > > Instance `let` bindings execute when objects are created. > > + **Static `let` bindings** are part of the static initializer for the class. > > > Static `let` bindings are guaranteed to execute before the type is first used. If one tried to refactor the `Vector2D` type by removing the `static` keywords before `zero`, `onex`, and `oney` private functions, ```fsharp type Vector2D(dx : float, dy : float) = let zero = Vector2D(0.0, 0.0) let onex = Vector2D(1.0, 0.0) let oney = Vector2D(0.0, 1.0) /// Get the zero vector static member Zero = zero /// Get a constant vector along the X axis of length one static member OneX = onex /// Get a constant vector along the Y axis of length one static member OneY = oney ``` then they would have received ``` error FS0039: The value or constructor 'zero' is not defined. ``` as `zero` and co. are only guaranteed to evaluate when the class is instantiated. [1]: https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/members/let-bindings-in-classes