diff --git a/Basic-practice-of-FSharp/Basic-practice-of-FSharp.fsproj b/Basic-practice-of-FSharp/Basic-practice-of-FSharp.fsproj index 91817fe..6645244 100644 --- a/Basic-practice-of-FSharp/Basic-practice-of-FSharp.fsproj +++ b/Basic-practice-of-FSharp/Basic-practice-of-FSharp.fsproj @@ -2,6 +2,7 @@ Exe net6.0 + 6.0 Basic_practice_of_FSharp @@ -16,5 +17,6 @@ + \ No newline at end of file diff --git a/Basic-practice-of-FSharp/ComputationExpressions.fs b/Basic-practice-of-FSharp/ComputationExpressions.fs new file mode 100644 index 0000000..9b12a32 --- /dev/null +++ b/Basic-practice-of-FSharp/ComputationExpressions.fs @@ -0,0 +1,104 @@ +module ComputationExpressions +// 计算表达式 + +// 语法 +// builder-expr { cexpr } + +// 计算表达式类似于一种monads,monoid, monad的通用型容器 +// 并且它们并不绑定到单个抽先,也不依赖于宏或其他形式的元编程来实现上下文相关语法 + +// F#内置计算表达式 + +// 序列表达式 + +// seq { cexpr } + +// yield表示从计算表达式中返回值,以便作用于IEnumerable +seq { + for i = 0 to 10 do yield i * i +} +|> printfn "%A" + +// 也可以存在条件 + +let weekdays includeWeekdays = + seq { + "礼拜一" + "礼拜二" + "礼拜三" + "礼拜四" + "礼拜五" + if includeWeekdays then + "礼拜六" + "礼拜七" + } + +weekdays true |> printfn "%A" + +// yield!将计算平展 +seq { + yield! seq { for i = 0 to 3 do yield i * i } + yield! seq { for i = 0 to 3 do yield i * i * i } +} +|> Seq.iter (printf "%A ") +printf "\n" + +// 查询表达式 + +// query { cexpr } + +query { + for i in 1..10 do + select i + contains 5 // 查询列表是否包含5,如果是返回true,反之为false +} +|> printfn "%A" + +query { + for i in 1..10 do + select i + count // 计数 +} +|> printfn "%A" + +query { + for i in 1..10 do + last // 查询列表中最后一个元素 +} +|> printfn "%A" + +query { + for i in 1..10 do + lastOrDefault // 查询列表中最后一个元素,如果不存在,则发挥元素默认值 +} +|> printfn "%A" + +query { + for i in 1..10 do + where (i = 4) // 以指定谓词剔除元素,谓词必须使用括号 + select i +} +|> printfn "%A" + +// ... + +// 异步表达式 + +// async { cexpr } + +// 任务表达式 + +// task { cexpr } + +// 自定义计算表达式 +// 所有的计算表达式都必须实现Yield方法 +// 其他自定义计算使用[]特性标记 +type MyComputationBuilder() = + member this.Yield(x) = x + +let mycom = MyComputationBuilder() + +mycom { + yield 1 +} +|> printfn "%A" \ No newline at end of file