应用性与单子组合器以及 Scalaz 中的自由单子

2023-11-24

几周前德拉吉萨·克斯曼诺维奇 asked 这里有一个问题关于如何在 Scala 7 中使用 free 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)

我想只需将蹦床举升到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

但它仍然让堆栈崩溃,所以我只是将其作为评论发布。

戴夫·史蒂文斯 just 指出与应用程序的排序*>而不是单子flatMap实际上工作得很好:

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

s(Nil).run

(嗯,当然它超级慢,因为这是你在 Scala 中做任何有趣的事情所付出的代价,但至少没有堆栈溢出。)

这里发生了什么?我认为这种差异可能没有原则上的原因,但实际上我不知道实施过程中会发生什么,而且目前没有时间进行深入研究。但我很好奇,如果其他人知道那就太好了。


Mandubian 是正确的,StateT 的 flatMap 不允许您绕过堆栈累积,因为在调用包装的 monad 的绑定之前立即创建了新的 StateT (在您的情况下,这将是 Free[Function0] )。

所以 Trampoline 无法提供帮助,但 State 函子上的 Free Monad 是确保堆栈安全的一种方法。

我们想要从 State[List[Int],Unit] 转到 Free[a[State[List[Int],a],Unit] 并且我们的 flatMap 调用将是 Free 的 flatMap (除了创建自由数据结构)。

val s = (1 to 100000).foldLeft( 
    Free.liftF[({ type l[a] = State[List[Int],a]})#l,Unit](state[List[Int], Unit](()))) {
      case (st, i) => st.flatMap(_ => 
          Free.liftF[({ type l[a] = State[List[Int],a]})#l,Unit](setS(i)))
    }

现在我们已经构建了一个自由数据结构,我们可以轻松地通过它来线程化状态:

s.foldRun(List[Int]())( (a,b) => b(a) )

调用 liftF 相当难看,所以我有一个 PR 来让 State 和 Kleisli monad 更容易,所以希望将来不需要 lambda 类型。

编辑:PR 已接受,所以现在我们有了

val s = (1 to 100000).foldLeft(state[List[Int], Unit](()).liftF) {
      case (st, i) => st.flatMap(_ => setS(i).liftF)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应用性与单子组合器以及 Scalaz 中的自由单子 的相关文章

  • Scala 如何将 Map 转换为元组的可变参数?

    在 Scala Play 2 2 x 测试的背景下 我有一个Map String String 我需要将其传递给接受的函数 String String 即一个可变参数 String String tuple e g val data Map
  • Scala 方法和高级类型参数

    我试图在 scala 中定义一个方法 它采用通用类型S lt Seq Double 并返回一个 S FixedLoad FixedLoad 是一个具体类型 但我的实现给了我错误 我不明白为什么 尽管我多次尝试去理解参数类型和高级类型 但我的
  • 运行 JAR 时“JCE 无法验证提供者 BC”

    在我的 scala 项目中我使用 org bouncycastle bcprov jdk14 1 51 用于密码学 如果它在 Scala IDE 中测试我的项目 它工作得很好 但是一旦我制作了一个 JAR 并尝试通过以下方式运行它java
  • 'val' 或 'var',可变还是不可变?

    我可以定义一个变量 通过var 是不可变的 var x scala collection immutable Set aaaaaa bbbbbb println x isInstanceOf scala collection immutab
  • Scala SBT 和 JNI 库

    我正在编写一个简单的应用程序Scala通过以下方式使用 leveldb 数据库leveldbjni图书馆 我的build sbt文件看起来像这样 name Whatever version 1 0 scalaVersion 2 10 2 l
  • 解析嵌套括号内包含的值

    我只是在开玩笑 奇怪地发现在简单的递归函数中解析嵌套括号有点棘手 例如 如果程序的目的是查找用户详细信息 它可能来自 name surname age to Bob Builder age 然后到Bob Builder 20 这是一个用于在
  • Spark:替换嵌套列中的空值

    我想更换所有n a以下数据框中的值unknown 它可以是scalar or complex nested column 如果它是一个StructField column我可以循环遍历列并替换n a using WithColumn 但我希
  • Scala repl 抛出错误

    当我打字时scala在终端上启动 repl 它会抛出此错误 scala gt init error error while loading AnnotatedElement class file usr lib jvm java 8 ora
  • 什么样的函数被认为是“可组合的”?

    维基百科文章函数组合 计算机科学 https en wikipedia org wiki Function composition computer science says 就像数学中通常的函数组合一样 每个函数的结果作为下一个函数的参数
  • 映射存在类型列表

    我有一个要映射的存在类型对象的列表 像这样的东西 sealed abstract class IntBox val v Int case object IB1 extends IntBox 1 case object IB2 extends
  • Scala Function.tupled 和 Function.untupled 等效于变量 arity,或者使用元组调用变量 arity 函数

    昨晚我试图围绕接受和调用通用函数做一些事情 即类型在调用站点上已知 但可能因调用站点而异 因此定义应该是跨参数通用的 例如 假设我有一个函数f A B C gt Z 其实这样的还有很多fs 我事先不知道 所以我无法确定类型或数量A B C
  • 如何将模型从 ML Pipeline 保存到 S3 或 HDFS?

    我正在尝试保存 ML Pipeline 生成的数千个模型 正如答案中所示here https stackoverflow com questions 32121046 run 3000 random forest models by gro
  • IntelliJ IDEA 13:新的 Scala SBT 项目尚未生成 src 目录结构

    我按照 Jetbrains 网站上的入门视频设置 IntelliJ IDEA 13 1 Community Edition 以与 Scala 配合使用 Scala 插件 v0 36 431 已安装 当我使用向导创建一个新的 Scala SB
  • 以编程方式启动 Scala REPL?

    我想从命令行启动 Scala Swing 应用程序 然后在应用程序启动后 放入 Scala REPL 中以用作控制界面 理想情况下 我还想预先绑定一些变量名称 更好的是使用 REPL 的 Java2D 终端模拟器 但我找不到任何合适的东西
  • 如何将 scala 列表转换为 javascript 数组?

    有更简单的方法吗 document ready function var jsArray if scalaList null for id lt scalaList jsArray push id 很简单 如下所示 import play
  • 如何在Gradle中支持多种语言(Java和Scala)的多个项目?

    我正在尝试将过时的 Ant 构建转换为 Gradle 该项目包含约50个Java子项目和10个Scala子项目 Java 项目仅包含 Java Scala 项目仅包含 Scala 每个项目都是由 Java 和 Scala 构建的 这大大减慢
  • 具有两个通用参数的上下文边界

    在 Scala 中 我可以使用上下文边界 def sort T Ordered t Seq T 与以下意思相同 def sort T t Seq T implicit def Ordered T 如果我有一个带有两个泛型参数的类怎么办 IE
  • Scala 宏的位置怎么了?

    我试图获取宏参数的原始输入字符串 但返回的位置似乎有点偏离 考虑这个宏 例如 object M import scala reflect macros Context import language experimental macros
  • 对两种类型之间的二元关系进行建模

    有企业 也有人 用户可以对某个企业点赞或发表评论 但效果是一样的can not发生在一个人身上 当用户发布有关某个企业的内容或对其点赞时 该企业就被称为target喜欢或帖子 trait TargetingRelation Targetin
  • 具有上限的联合类型

    我正在遵循这个问题的公认答案中提出的技术如何定义 类型析取 联合类型 https stackoverflow com questions 3508077 does scala have type disjunction union type

随机推荐

  • es6 导入中换行的 JsFormat 规则

    JsFormat for Sublime Text 3 符合大多数 ES6 标准 但是 在自动格式化导入语句时 它会向对象导入添加一个新行 预格式化行如下所示 import func1 func2 func3 from some modul
  • 让移动的矩形更加平滑

    我想让我的矩形的 动画 更加流畅 目前它确实很笨拙 我知道其中的原因 其中一个坐标先于另一个坐标成为所需值 例如 如果我当前位于 0 0 并且需要转到 150 75 并且我每秒均等地递增每个值 则 y 线将比 x 线快得多 var canv
  • 为什么使用 RxJS .asObservable() getter/factory 函数模式?

    在许多使用 RxJS 的代码库中 我似乎遇到了暴露私有的模式Subjects as Observables via a getter或正常getObservable 功能 我的问题不是为什么 asObservable 被使用 但为什么它看起
  • 如何缩小 HTML 代码?

    我的想法是somehow缩小服务器端的 HTML 代码 以便客户端接收更少的字节 缩小 是什么意思 不拉拉链 更像是 jQuery 创建者所做的 min js版本 换句话说 我需要删除不必要的空格和换行符 但我无法删除太多 HTML 表示的
  • 您可以将扩展方法设为静态/共享吗?

    好吧 我可能在这里误解了一些东西 但是 据我所知 扩展方法必须包含在模块中 而不是类中 您不能将模块中的方法设为静态 共享 因此 如果不实例化类 就无法在类上使用扩展方法 换句话说 您不能在 String 上创建名为 MyExtension
  • 如何在Matlab中将原点设置为轴的中心

    当我在 Matlab 中绘制函数 f x 时 例如正弦函数 我得到的图形是这样的 我想以一种相当不同的方式绘制它 例如用 Mathematica 生成的 注意轴位置 连同刻度 以及 x 和 y 标签位置 任何帮助将不胜感激 因为并非所有读者
  • Nuget包更新问题

    我在 Visual Studio 2013 中更新 Nuget 包时遇到问题以寻求解决方案 我右键单击该解决方案 选择 管理解决方案包 然后在更新选项卡中选择 全部更新 一切似乎都更新得很好 但是 在更新选项卡中 已更新的软件包仍然显示为需
  • JavaFX 是开源的吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 安装 JDK 时 我在 C Program Files Java jdk1 7 xxx 文件夹中找到 src zip 但找不到 javafx 源代码
  • python 池 apply_async 和 map_async 不会在满队列上阻塞

    我对 python 相当陌生 我正在使用多处理模块来读取标准输入上的文本行 以某种方式转换它们并将它们写入数据库 这是我的代码片段 batch pool multiprocessing Pool 20 i 0 for i content i
  • 如何让搜索引擎索引数据库驱动的内容?

    我怎样才能使数据库中的内容可供搜索引擎 例如谷歌 用于索引 Example mysql 中的表有一个名为 Headline 的字段 它等于 BMW M3 2005 我的网站名称是 MySite 用户在谷歌中输入 BMW M3 2005 My
  • 从 JDBC 调用 Oracle 面向对象的 PL/SQL 成员过程

    在面向对象的 PL SQL 中 我可以向类型添加成员过程和函数 这里给出一个例子 create type foo type as object foo number member procedure proc p in number mem
  • 使用express.js 进行代理

    为了避免同域 AJAX 问题 我希望我的 Node js Web 服务器转发来自 URL 的所有请求 api BLABLA例如到另一台服务器other domain com 3000 BLABLA 并透明地向用户返回该远程服务器返回的相同内
  • Spark Parquet 统计(最小/最大)集成

    我一直在研究 Spark 如何在 Parquet 中存储统计信息 最小 最大 以及它如何使用这些信息进行查询优化 我有几个问题 第一次设置 Spark 2 1 0 下面设置一个1000行的Dataframe 一个long类型和一个strin
  • RunTimeError:Rails 3.1.4 应用程序控制器的 rspec 2.10.1 中的 ActionController::RackDelegation

    在我们的 Rails 3 1 4 应用程序中 rspec用于测试公共方法require signin在应用程序控制器中 这是 require signin 方法 def require signin if signed in flash n
  • 为什么 SynchronizationContext.Current 为空?

    Error Object reference not set to an instance of an object 下面的算法有效 我试过了 然后我删除了Winform项目到另一个目录并SynchronizationContext Cur
  • 使用 Eclipse 和 ADT 重新连接到 Android 上的调试进程

    可以使用 eclipse 调试透视图来断开与调试进程的连接 之后 是否可以在此进程上重新连接 Eclipse 调试器 是的 一般来说 您可以使用 调试 视图中的 断开连接 工具栏按钮断开连接 看起来有点像水平的红色闪电 要重新连接 请切换到
  • WCF本身支持多线程吗?

    我开发了一个概念验证应用程序 用于查询 WCF 是否支持多线程 现在 我所做的就是创建一个标记为的服务合同 ServiceBehavior InstanceContextMode InstanceContextMode Single Con
  • 正则表达式匹配空(或全空白)字符串

    我想匹配一个可以有任何类型的空白字符的字符串 特别是我使用的是 PHP 或者任何判断字符串是否为空或只有空格的方法也会有所帮助 您不需要为此使用正则表达式 只需使用 if Trim str echo empty string
  • 使用 EXTRA_PLUGGED 获取 USB 电缆插入 IN/OUT 事件不起作用

    我的目的是在首选项中保存 Android 设备 USB 电源线的当前状态 已连接 已断开 从开发者网站我看到有两个获取该状态的意图 ACTION POWER CONNECTED DISCONNECTED 所以我使用了与开发人员发布的相同的代
  • 应用性与单子组合器以及 Scalaz 中的自由单子

    几周前德拉吉萨 克斯曼诺维奇 asked 这里有一个问题关于如何在 Scala 7 中使用 free monad 来避免这种情况下的堆栈溢出 我对他的代码进行了一些调整 import scalaz Scalaz def setS i Int