26 lines
817 B
Forth
26 lines
817 B
Forth
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 () |