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.
What is the difference between static let and static member in F#?
Taking the example from this Stackoverflow question:
type Vector2D(dx : float, dy : float) =
static let zero = Vector2D(0.0, 0.0)
static let onex = Vector2D(1.0, 0.0)
static 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
1 answer
Paraphrasing the F# language guide's let Bindings in Classes article:
A
letbinding in a class creates a private field or function; to expose data or functions publicly, declare a property or a member method.
An instance
letbinding is aletbinding that is not preceded by thestatickeyword.Instance
letbindings execute when objects are created.Static
letbindings are part of the static initializer for the class.Static
letbindings 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,
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.

0 comment threads