我有这样的声明:
newtype State st a = State (st -> (st, a))
因此State
的类型是:
State :: (st -> (st, a)) -> State st a
我无法理解其含义:
st
和a
只是两个数据类型的占位符吗?正确?答案 0 :(得分:2)
是。数据构造函数是Haskell中的函数,具有可以与它们进行模式匹配的附加功能。因此,例如,如果您有fs : [st -> (st, a)]
类型的列表,则可以执行map State fs :: [State st a]
。
状态monad常规工作的方式是State st a
表示状态转换器:采用初始状态,执行可能依赖或改变该状态的某些计算,并生成类型a
的结果。组合两个状态转换器意味着创建一个复合的状态变换器,执行第一个具有初始状态的状态,然后执行第二个具有在第一个执行后保持的状态。
因此State
monad实现模型直接作为类型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
答案 1 :(得分:1)
是的,是的。 st
是州类型,a
是答案类型。