相关疑难解决方法(0)

适用于一元组合者和Scalaz中的免费monad

几个星期前,Dragisa Krsmanovic 在这里了一个关于如何在Scalaz 7中使用免费monad来避免堆栈溢出的问题(我已经调整了他的代码):

import scalaz._, Scalaz._

def setS(i: Int): State[List[Int], Unit] = modify(i :: _)

val s = (1 to 100000).foldLeft(state[List[Int], Unit](())) {
  case (st, i) => st.flatMap(_ => setS(i))
}

s(Nil)
Run Code Online (Sandbox Code Playgroud)

我认为只是举起一个蹦床StateT应该工作:

import Free.Trampoline

val s = (1 to 100000).foldLeft(state[List[Int], Unit](()).lift[Trampoline]) {
  case (st, i) => st.flatMap(_ => setS(i).lift[Trampoline])
}

s(Nil).run
Run Code Online (Sandbox Code Playgroud)

但它仍然打击堆栈,所以我只是将其作为评论发布.

Dave Stevens刚刚指出用应用程序*>而不是monadic 进行排序flatMap实际上运行得很好:

val s = (1 to 100000).foldLeft(state[List[Int], Unit](()).lift[Trampoline]) {
  case …
Run Code Online (Sandbox Code Playgroud)

stack-overflow scala trampolines scalaz free-monad

11
推荐指数
2
解决办法
2247
查看次数

标签 统计

free-monad ×1

scala ×1

scalaz ×1

stack-overflow ×1

trampolines ×1