hey, can someone help me analyze the following function?
fun → if r="-a" then Some (Rat(1,3)) else if r="_b" then Some (Rat(1,6)) else Some (Rat(0,1));;
I am only interested in Some (Rat(n,n1)) part. what Some will do in this case?
and
type value = Rat of rat | Fun of var * state * expr and state = var → value option ;;
i am wondering about value option part.
A value of type 'a option
denotes a value of type 'a
that can be present or not: Some x
represents the case where the value is present and None
the absence of such a value. Note that you can format your code with ```ocaml ```
. For instance:
fun r ->
if r="-a" then Some (Rat(1,3))
else if r="_b" then Some (Rat(1,6))
else Some (Rat(0,1))
OCaml has variant data types that are used to represent variants of the same entity, e.g.,
type figure = Circle | Rect
Each variant may have its own varinat-specific values, e.g.,
type figure = Circle of int | Rect of int * int
The capitalized part is called constructor and can be used to construct values, so Circle 5
is a figure that is a circle with the specified radius. Another example, Rect (3,4)
creates a figure that represents a rectangle. Constructors are also used to pattern match on variants of the type. You may think of this as a downcasting, e.g.,
let area : figure -> int = function
| Circle r -> 3 * r * r
| Rectangle (x,y) -> x * y
So, instead of using class hierarchies and visitors, we use a simple and efficient representation that relies on variants and records, together known as algebraic data types.
Now back to option
. This is a type from the OCaml standard library that has the following definition,
type 'a option = Some of 'a | None
So it that int option
denotes a type of values that have two variants Some x
where x
has type int
and None
that doesn’t have any payload. This 'a
denotes a parameterized type. So that 'a option
is in fact a family of types. But this is another lesson. Please, consider reading the OCaml tutorial, it is short and easy. There are also a lot of books about OCaml.