haskell状态单子函数get?
根据状态单子的get函数,有一个问题: 如果我跑 运行状态获取1 我得到了结果 (1,1) 这对我来说没问题,因为get函数将结果值设置为state,在这种情况下,state为1。因此,(1,1)是结果。嗯 但如果我跑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
运行状态(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..”符号中,就像您使用“>>=”一样上面的函数。再次感谢您。@jimmytm>>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)