From 5ee7d71a4b52c45ce78c67b1991f043313169827 Mon Sep 17 00:00:00 2001 From: Hadrian Tang Date: Sat, 24 May 2025 17:53:14 +0800 Subject: [PATCH 1/2] Update Sequence Expressions snippet to use implicit yields --- _snippets/sequence_expressions.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/_snippets/sequence_expressions.md b/_snippets/sequence_expressions.md index e5044a38..90916d95 100644 --- a/_snippets/sequence_expressions.md +++ b/_snippets/sequence_expressions.md @@ -3,15 +3,14 @@ order: 15 title: SequenceExpressions.fs excerpt_separator: code: | - // A function generating a sequence of numbers let rec fizzBuzzSeq n = seq { - yield - match n with - | x when x % 15 = 0 -> "fizzbuzz" - | x when x % 3 = 0 -> "fizz" - | x when x % 5 = 0 -> "buzz" - | _ -> n.ToString() - + match n with + | x when x % 15 = 0 -> "fizzbuzz" + | x when x % 3 = 0 -> "fizz" + | x when x % 5 = 0 -> "buzz" + | _ -> n.ToString() + + // Tail recursion makes this as efficient as a "while" loop yield! fizzBuzzSeq (n + 1) } From 1ea2e8e7de9742918a013da6e73b0c85f1a348c7 Mon Sep 17 00:00:00 2001 From: Hadrian Tang Date: Sat, 24 May 2025 18:03:55 +0800 Subject: [PATCH 2/2] Update computation_expressions.md --- _snippets/computation_expressions.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/_snippets/computation_expressions.md b/_snippets/computation_expressions.md index d5aba953..42a728c2 100644 --- a/_snippets/computation_expressions.md +++ b/_snippets/computation_expressions.md @@ -5,13 +5,12 @@ excerpt_separator: code: | // Define a custom computation expression for validation type ValidationBuilder() = - member _.Bind(x, f) = + member _.Bind(x, f) = // Defines "let!" match x with | Ok value -> f value | Error e -> Error e - member _.Return(x) = Ok x - member _.ReturnFrom(x) = x - + member _.Return(x) = Ok x // Defines "return" + member _.ReturnFrom(x) = x // Defines "return!" let validate = ValidationBuilder() type Person = { Name: string; Age: int } @@ -22,11 +21,14 @@ code: | if age >= 0 && age < 150 then Ok age else Error "Age must be between 0 and 150" - let! validName = + let! nonEmptyName = if String.length name > 0 then Ok name else Error "Name cannot be empty" - return { Name = validName; Age = validAge } + if String.length name > 100 then + return! Error "Name is too long!" + else + return { Name = nonEmptyName; Age = validAge } } --- ## Clean Code with Computation Expressions