我有这样的声明:
newtype State st a = State (st -> (st, a))
因此类型State
为:
State :: (st -> (st, a)) -> State st a
我无法理解其中的含义:
- 是
st
并且a
只是两种数据类型的占位符?正确的? - 该语句是否意味着 State 是一个以函数为参数的函数?
是的。数据构造函数是 Haskell 中的函数,具有可以对它们进行模式匹配的附加功能。因此,例如,如果您有类型列表,则fs : [st -> (st, a)]
可以执行map State fs :: [State st a]
.
状态单子通常的工作方式是State st a
表示状态转换器:一个接受初始状态的事物,执行一些可能依赖或改变该状态的计算,并产生类型的结果a
。组合两个状态转换器意味着创建一个复合的,它以初始状态执行第一个,然后以第一个执行后保持的状态执行第二个。
所以State
monad 实现模型直接作为 type 的函数st -> (st, a)
。组合两个这样的函数只是生成一个复合函数的问题,该函数将初始状态提供给第一个,将由此产生的状态传递给第二个,并返回第二个的最终状态和结果。在代码中:
bindState :: State st a -> (a -> State st b) -> State st b
bindState (State function1) f =
State $ \initialState -> let (nextState, firstResult) = function1 initialState
in f firstResult
是的,是的。st
是状态类型,是a
答案类型。