我试图在 OCaml 中实现 state monad(作为练习)。我的实现如下所示:
module type MONAD_BUILDER =
sig
type 'a t
val return : 'a -> 'a t
val bind : 'a t -> ('a -> 'b t) -> 'b t
end;;
module MonadBuilder = functor (M: MONAD_BUILDER) ->
struct
let ( >>= ) = M.bind
let return = M.return
end;;
module StateM =
struct
type 'a state = { state: 's . 's -> ('a * 's) }
type 'a t = 'a state
let return x = { state = fun s -> (x, s) }
let bind m f =
let aux s =
let (x, s') = m.state s in
(f x).state s'
in { state = aux }
let run m x = fst (m.state x)
end;;
我为记录字段选择了存在类型,因为我不喜欢使用仿函数并将状态类型包装在模块中的想法。getState
上面的实现是有效的,但是我在实现and时遇到了问题setState
。我试图像这样实现它们:
let getState = { state = fun s -> (s, s) }
let setState s = { state = fun _ -> ((), s) }
这不起作用,因为推断的字段类型,例如'a -> ('a * 'a)
和'a -> (unit * 'a)
,不如声明的类型通用's . 's -> ('a * 's)
。我理解为什么会发生这种情况,但我想知道是否有另一种使用记录方法使其工作的方法?
谢谢。
干杯,亚历克斯