作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此问题与此其他 question 有关但简化为更简单的情况:
我假设以下进口:
import scalaz._, Scalaz._
import Free._, effect._
val fromOneIO: () => IO[Int] = {
var i = 0; () => { i += 1; IO(i) }
}
val fromOne: () => Int = {
var i = 0; () => { i += 1; i }
}
def rec(i: Int): Int = {
if (i == 0) {
fromOne()
} else {
rec(i - 1) + fromOne()
}
}
def rec1(i: Int): Trampoline[Int] = {
if (i == 0) {
Return(fromOne())
} else {
suspend {
for {
a <- rec1(i - 1)
b <- Return(fromOne()): Trampoline[Int]
} yield a + b
}
}
}
def recio(i: Int): Trampoline[IO[Int]] = {
if (i == 0) {
Return(fromOneIO())
} else {
suspend {
for {
ioa <- recio(i - 1)
iob <- Return(fromOneIO()): Trampoline[IO[Int]]
} yield {
for (a <- ioa; b <- iob) yield a + b
}
}
}
}
rec(100) // overflows for arg 10000
rec1(10000).run // works
recio(10000).run.unsafePerformIO() //overflows
TrampolineT
将使用
unsafePerformIO
并将提取的 io 值重新包装到挂起状态?
最佳答案
所以 IO(_)
已经是 trampolined ,为了它的值(value)。除了 folone 的建议之外,我还可以通过像这样更改第二个来避免溢出:
val s = for (a <- ioa; b <- iob) yield a + b
val s1 = s.unsafePerformIO()
IO(s1)
IO(for (a <- ioa; b <- iob) yield a + b).flatMap(identity)
IO(_)
采用按名称参数,所以
IO(expr)
和
val e = expr; IO(e)
行为不一样。这会溢出!
val s = for (a <- ioa; b <- iob) yield a + b
IO(s.unsafePerformIO())
IO
中。扁平化将是解决堆栈问题的方法。
关于scalaz 蹦床和 IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16171618/
假设我正在尝试通过一个操作来实现一种非常简单的领域特定语言: printLine(line) 然后我想写一个接受整数 n 的程序作为输入,如果 n 打印一些东西可被 10k 整除,然后用 n + 1
我的目标是拦截来 self 没有源代码的定制应用程序的出站 TCP 数据包。我需要调整出站数据中的几个参数。这是一个较旧的应用程序,原来的公司不再销售并且开发人员不再可用。 所以我计划在 send()
我是一名优秀的程序员,十分优秀!