我有这样的声明:
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。组合两个状态转换器意味着创建一个复合的,它以初始状态执行第一个,然后以第一个执行后保持的状态执行第二个。
所以Statemonad 实现模型直接作为 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答案类型。