而>;=(状态s)Monad在Haskell中的实现
在《学好Haskell》一书中,(s状态)Monad中>>=运算符的实现是:而>;=(状态s)Monad在Haskell中的实现,haskell,functional-programming,state,Haskell,Functional Programming,State,在《学好Haskell》一书中,(s状态)Monad中>>=运算符的实现是: instance Monad (State s) where return x = State $ \s -> (x, s) (State h) >>= f = State $ \s -> let (a, newState) = h s (State g) = f a
instance Monad (State s) where
return x = State $ \s -> (x, s)
(State h) >>= f = State $ \s -> let (a, newState) = h s
(State g) = f a
in g newState
如我们所知,>>=运算符的类型为::ma->(a->mb)->mb。该运算符的第二个参数是类型为(a->mb)
的函数f,那么为什么在(状态s)的实现中函数f的输入类型不是s->(a,s)
,而是结果a
谢谢大家!我想我已经知道了如何> > .<强>我们不能把函数F的输入类型当作Monad中包含的类型,但是我们应该把它看作是Maad的输入类型。< P>因为<代码> f>代码>有类型<代码> A- >M B(实际上,<代码> ->状态S b<代码>),它的输入有类型<代码> A<代码>。它是一种输出,其类型具有您提到的形状
s->(b,s)
(实际上,状态sb
)。因为f
具有类型a->mb
(实际上,a->状态sb
),所以它的输入具有类型a
。它的输出类型具有您提到的形状s->(b,s)
(实际上,状态sb
)。类型a->mb
字面意思是“具有输入a
和输出mb
的函数”。这就是为什么它的输入是a作者在这里提供了与变量类型匹配的变量名称。第一个函数给出一个a
和一个s
(newState),第二个函数(f
)将a
转化为mb
。类型a->mb
字面意思是“一个具有输入a
和输出mb
的函数”。这就是为什么它的输入是a作者在这里提供了与变量类型匹配的变量名称。第一个函数给出一个a
和一个s
(newState),第二个函数(f
)将a
转换成mb
。