Today we learn control flow, or branching
sometimes we need to execute a block of code only when it meets some condition
//Pseudocode
if conditionOne then doTaskOne
else if conditionTwo then doTaskTwo
else doSomethingElse
we introduce 2 ways of branching
if...then
let temperature = 15
if temperature < 0 then
printfn "Wear down coat"
elif temperature < 10 then
printfn "Wear sweater"
elif temperature < 20 then
printfn "Wear long sleeves"
elif temperature < 30 then
printfn "Wear T-shirt"
else
printfn "Wear bikini"
temperature = 15, the first branch suits is temperature < 20 , even though temperature < 30 is also true, the rest logic will not execute
match...with
// Match expression.
match test-expression with
| pattern1 [ when condition ] -> result-expression1
| pattern2 [ when condition ] -> result-expression2
| ...
equivalent example:
let temperature = 15
match temperature with
| temperature when temperature < 0 -> printfn "Wear down coat"
| temperature when temperature < 10 -> printfn "Wear sweater"
| temperature when temperature < 20 -> printfn "Wear long sleeves"
| temperature when temperature < 30 -> printfn "Wear T-shirt"
| _ -> printfn "Wear bikini"
AND Pattern: we can combine conditions with (&&
) operator, it hits when both condition match
let age = 10
match age with
| age when age > 0 && age <= 1 -> printfn "Infant"
| age when age > 1 && age <= 12 -> printfn "Child"
| age when age > 12 && age <= 16 -> printfn "Teenager"
| age when age > 16 -> printfn "Adults"
| _ -> printfn "Not born"
OR Pattern: we can combine patterns using the (||
) operator to match multiple patterns
let x = 10
match x with
| x when x > 0 || x = 0 -> printfn "Positive or Zero"
| _ -> printfn "Negative"
we can define a pattern matching function
let temperature = 15
let clothingAdvice temp =
match temp with
| t when t < 0 -> "Wear down coat"
| t when t < 10 -> "Wear sweater"
| t when t < 20 -> "Wear long sleeves"
| t when t < 30 -> "Wear T-shirt"
| _ -> "Wear bikini"
printfn "%s" (clothingAdvice temperature)
another example from windows documentation
type Shape =
| Square of side: double
| Rectangle of width: double * length: double
let getArea shape =
match shape with
| Square side -> side * side
| Rectangle (width, length) -> width * length
let square = Square 2.0
printfn $"The area of the square is {getArea square}"
let rect = Rectangle (3.0, 2.0)
printfn $"The area of the rect is {getArea rect}"
getArea function calculate the area according to different shape
for a Square, it use side * side = 2.0 * 2.0
for a Rectangle, it use width * length = 3.0 * 2.0
The area of the square is 4
The area of the rect is 6
we didn't learn type yet, it defines a Union type here, and there is more powerful usage of match, we will introduce type, Union and discover more usage of match in the coming days
Top comments (0)