0

我有这样的声明:

newtype State st a = State (st -> (st, a))

因此类型State为:

State :: (st -> (st, a)) -> State st a

我无法理解其中的含义:

  • st并且a只是两种数据类型的占位符?正确的?
  • 该语句是否意味着 State 是一个以函数为参数的函数?
4

2 回答 2

2

是的。数据构造函数是 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
于 2012-06-05T18:47:27.370 回答
1

是的,是的。st是状态类型,是a答案类型。

于 2012-06-05T16:12:55.333 回答