newtype语句的含义

时间:2012-06-05 16:01:29

标签: haskell newtype

我有这样的声明:

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

因此State的类型是:

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

我无法理解其含义:

  • sta只是两个数据类型的占位符吗?正确?
  • 该语句是否意味着State是一个将函数作为参数的函数?

2 个答案:

答案 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是答案类型。