's. 's -> ('a * 's)
- универсальный тип.Вам будет трудно реализовать состояние с универсальными типами ...
Там нет чистого способа инкапсуляции экзистенциального типа без использования модуля (потому что экзистенциальные типы - это то, для чего нужны абстрактные типы).
Конечно, вместо этого вы можете опубликовать тип состояния:
type ('a,'s) state = { state : 's -> ('a * 's) }
Или даже короче,
type ('a,'s) state = 's -> 'a * 's
С дополнительным параметром ваш код запускается.Однако вы сталкиваетесь с тем, что ваш параметр должен обрабатываться монадой.Таким образом, вы можете либо скрыть это при построении монады:
module Monad = MonadBuilder(struct
include StateM
type 'a t = ('a,myStateType) state
end)
Или изменить свой дизайн монады, чтобы включить дополнительный параметр типа, который должен использоваться для экзистенциальных типов:
module type MONAD_BUILDER =
sig
type ('a,'param) t
val return : 'a -> ('a,'param) t
val bind : ('a,'param) t -> ('a -> ('b,'param) t) -> ('b,'param) t
end;;