读取器单子
This commit is contained in:
parent
5d17da7cea
commit
8b272662ca
|
@ -0,0 +1,26 @@
|
||||||
|
namespace Sanchime.Monads
|
||||||
|
|
||||||
|
[<AutoOpen>]
|
||||||
|
module Reader =
|
||||||
|
|
||||||
|
// 读取器单子是计算状态并产生一个值't的单子
|
||||||
|
type Reader<'s, 't> = Reader of ('s -> 't)
|
||||||
|
|
||||||
|
// 单位元不读取任何操作,因此产生Reader<unit, 'a>
|
||||||
|
let unit v = Reader (fun () -> v)
|
||||||
|
|
||||||
|
// 绑定操作接受Reader和一个读取状态另一部分的函数'a -> Reader<'b, 'c>
|
||||||
|
// 并在一个元组中产生一个读取两个状态值的Reader<('d * 'b), 'c>
|
||||||
|
let bind f (Reader (g)) = Reader (fun (a, b) ->
|
||||||
|
let v = g a in
|
||||||
|
let (Reader h) = f v in
|
||||||
|
h b)
|
||||||
|
|
||||||
|
type ReaderBuilder () =
|
||||||
|
member __.Return(v) = unit v
|
||||||
|
member __.Bind(v, f) = bind f v
|
||||||
|
member __.Delay(f) = Reader (fun s ->
|
||||||
|
let (Reader h) = f ()
|
||||||
|
h s)
|
||||||
|
|
||||||
|
let reader = ReaderBuilder ()
|
|
@ -2,4 +2,28 @@ namespace Sanchime.Monads
|
||||||
|
|
||||||
module Test =
|
module Test =
|
||||||
|
|
||||||
let test = 0
|
let reader_example () =
|
||||||
|
|
||||||
|
let cache (Reader(f)) = (Reader (fun (v1, v2) ->
|
||||||
|
match v1 with
|
||||||
|
| None -> f v2
|
||||||
|
| Some v -> v))
|
||||||
|
|
||||||
|
let read s n = reader {
|
||||||
|
printfn "读取:%s" s
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
let m = reader {
|
||||||
|
let! a = cache <| read "A" 1
|
||||||
|
let! b = cache <| read "B" 2
|
||||||
|
let! c = read "C" 3
|
||||||
|
return a + b + c
|
||||||
|
}
|
||||||
|
|
||||||
|
let (Reader f) = m
|
||||||
|
|
||||||
|
f ((None, ()), ((None, ()), ((), ()))) |> ignore
|
||||||
|
f ((Some 1, ()), ((None, ()), ((), ()))) |> ignore
|
||||||
|
f ((None, ()), ((Some 2, ()), ((), ()))) |> ignore
|
||||||
|
f ((Some 1, ()), ((Some 2, ()), ((), ()))) |> ignore
|
||||||
|
|
|
@ -7,5 +7,5 @@ open Sanchime.Algrithm.Sort.Merge
|
||||||
open Sanchime.Algrithm.Sort.Select
|
open Sanchime.Algrithm.Sort.Select
|
||||||
|
|
||||||
|
|
||||||
|
Sanchime.Monads.Test.reader_example () |> ignore
|
||||||
// qsort |> test
|
// qsort |> test
|
|
@ -10,6 +10,7 @@
|
||||||
<Compile Include="Algrithms/Sorts/InsertSort.fs" />
|
<Compile Include="Algrithms/Sorts/InsertSort.fs" />
|
||||||
<Compile Include="Algrithms/Sorts/BubbleSort.fs" />
|
<Compile Include="Algrithms/Sorts/BubbleSort.fs" />
|
||||||
<Compile Include="Algrithms/Sorts/Test.fs" />
|
<Compile Include="Algrithms/Sorts/Test.fs" />
|
||||||
|
<Compile Include="Monads/ReaderMonad.fs" />
|
||||||
<Compile Include="Monads/FreeMonad.fs" />
|
<Compile Include="Monads/FreeMonad.fs" />
|
||||||
<Compile Include="Monads/Test.fs" />
|
<Compile Include="Monads/Test.fs" />
|
||||||
<Compile Include="Program.fs" />
|
<Compile Include="Program.fs" />
|
||||||
|
|
Loading…
Reference in New Issue