我正在使用Scala和scalaz库编写代码。我编写了一个自定义类型类来对ST monad列表进行排序
implicit def richList[A, S](l: List[ST[S, A]]) =
new {
def sequence: ST[S, List[A]] =
l.foldLeft(ST[S, List[A]](Nil))(
(listST, elemG) =>
for (list <- listST;
elem <- elemG
) yield elem :: list).map(_.reverse)
}
ST monad调用ST.map并且ST.flatMap不是堆栈溢出安全的。对于大型列表,对列表进行排序,然后在ST monad结果上调用ST.runST将导致堆栈溢出异常。我试图在互联网上搜索ST monad的热切类似物,但谷歌搜索只显示状态monad的自动填充功能。 IO monad有一个严格的版本,map和flatMap链不会炸掉堆栈。 ST monad有类似的东西吗?