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
haskell状态单子函数get?_Haskell_Monads_State Monad - Fatal编程技术网

haskell状态单子函数get?

haskell状态单子函数get?,haskell,monads,state-monad,Haskell,Monads,State Monad,根据状态单子的get函数,有一个问题: 如果我跑 运行状态获取1 我得到了结果 (1,1) 这对我来说没问题,因为get函数将结果值设置为state,在这种情况下,state为1。因此,(1,1)是结果。嗯 但如果我跑 运行状态(do{(a,b)这是因为您在get之后执行了一些操作,即返回其中一个组件。忽略newtype包装 return x = \s -> (x,s) 所以 随着(>>=)的定义 \s1 -> let (r,s2) = (\s -> (s,s)) s1

根据状态单子的get函数,有一个问题:

如果我跑

运行状态获取1

我得到了结果

(1,1)

这对我来说没问题,因为get函数将结果值设置为state,在这种情况下,state为1。因此,(1,1)是结果。嗯

但如果我跑


运行状态(do{(a,b)这是因为您在
get
之后执行了一些操作,即
返回其中一个组件。忽略newtype包装

return x = \s -> (x,s)
所以

随着
(>>=)
的定义

\s1 -> let (r,s2) = (\s -> (s,s)) s1
       in (\(a,b) -> (\t -> (a,t))) r s2
当您以
(False,0)
的初始状态运行它时,它将展开

let (r,s2) = (\s -> (s,s)) (False,0)
~> let (r,s2) = ((False,0),(False,0))
in (\(a,b) -> (\t -> (a,t))) r s2
~> in (\(a,b) -> (\t -> (a,t))) (False,0) (False,0)
~> in (\t -> (False,t)) (False,0)    -- match (a,b) with (False,0)
~> in (False, (False,0))

返回b的另一个例子与之类似。

丹尼尔的回答当然是正确和完整的,所以让我试着从另一个角度回答它,并讨论可能的误解

您希望为返回
((False,0)、(False,0))

runState (do{(a,b) <- get; return a}) (False, 0)

runState(do{(a,b)让我们尝试第三个答案:

确实,
get=\s->(s,s)
,但是(在State的情况下)do表示法中的箭头只显示。这都是因为这个monad的绑定定义

因此,您不会得到整对
(s,s)
。您得到的只是第一对
s


您提供了initial state=
(False,0)
哇!太好了!非常感谢您。还有一个问题:您能告诉我state monad中“>>”函数的定义吗?那太好了。可能在“let..in..”符号中,就像您使用“>>=”一样上面的函数。再次感谢您。@jimmyt
m>>n
m>=\\\\u->n
是一样的,也就是说,它只是一元绑定,但丢弃了值。您可以将
m>>n
理解为“执行m,然后执行n”的意思谢谢。你们都是对的。我的错误是对state monad中的bind函数>>=的误解。关于这个:“runState(do{(a,b))我建议阅读以下内容:
let (r,s2) = (\s -> (s,s)) (False,0)
~> let (r,s2) = ((False,0),(False,0))
in (\(a,b) -> (\t -> (a,t))) r s2
~> in (\(a,b) -> (\t -> (a,t))) (False,0) (False,0)
~> in (\t -> (False,t)) (False,0)    -- match (a,b) with (False,0)
~> in (False, (False,0))
runState (do{(a,b) <- get; return a}) (False, 0)
runState (do{(a,b) <- get; return (a,b)}) (False, 0)