Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
而>;=(状态s)Monad在Haskell中的实现_Haskell_Functional Programming_State - Fatal编程技术网

而>;=(状态s)Monad在Haskell中的实现

而>;=(状态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

在《学好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
                                    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