Sanchime.Learn/Monads/ReaderMonad.fs

26 lines
817 B
Forth
Raw Normal View History

2022-07-06 21:48:36 +08:00
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 ()