【发布时间】:2014-05-31 00:27:41
【问题描述】:
有人可以举例说明如何使用 ScalaZ Free monad 吗?
例如,如果我有一个简单的 State 函数并且想要应用它 10,000 次,我会得到 StackOverflowError:
def setS(i: Int) :State[List[Int], Unit] = State { l => ( i::l, () ) }
val state = (1 to 10000).foldLeft( put(Nil :List[Int]) ) {
case (st, i) => st.flatMap(_ => setS(i))
}
state(Nil)
据我了解,Free monad 可以帮助避免这种情况。我如何使用 Free monad 重写这段代码以不导致堆栈溢出?
【问题讨论】:
-
我想this approach 可以工作,但事实并非如此。我今天没有时间研究它,但我很想知道答案。
-
@Noah 这正是促使我尝试这个的确切文章。我知道,对于这个特定的示例,您可以使用 traverseS 来完成。但我的问题更笼统,我使用一个集合只是为了说明问题。
-
由于某种原因,@TravisBrown 的要点在使用 Applicative 而不是 Monad 来组合 StateT 时起作用。 gist.github.com/drstevens/3ea464446ee59463af1e