帮助我理解这段 Scala 代码:scalaz IO Monad

2024-01-07

这是我试图理解的代码(它来自http://apocalisp.wordpress.com/2010/10/17/scalaz-tutorial-enumeration-based-io-with-iteratees/ http://apocalisp.wordpress.com/2010/10/17/scalaz-tutorial-enumeration-based-io-with-iteratees/):

object io {
  sealed trait IO[A] {
    def unsafePerformIO: A
  }

  object IO {
    def apply[A](a: => A): IO[A] = new IO[A] {
      def unsafePerformIO = a
    }
  }

  implicit val IOMonad = new Monad[IO] {
    def pure[A](a: => A): IO[A] = IO(a)
    def bind[A,B](a: IO[A], f: A => IO[B]): IO[B] = IO {
      implicitly[Monad[Function0]].bind(() => a.unsafePerformIO,
                                        (x:A) => () => f(x).unsafePerformIO)()
    }
  }
}

这段代码是这样使用的(我假设import io._是隐含的)

def bufferFile(f: File) = IO {   new BufferedReader(new FileReader(f)) }

def closeReader(r: Reader) = IO {   r.close }

def bracket[A,B,C](init: IO[A], fin: A => IO[B], body: A => IO[C]): IO[C] = for { a <- init
      c <- body(a)
      _ <- fin(a) }   yield c

def enumFile[A](f: File, i: IterV[String, A]): IO[IterV[String, A]] =  bracket(bufferFile(f),
          closeReader(_:BufferedReader),
          enumReader(_:BufferedReader, i))

让我们从bufferFile定义。我的想法是否正确applyio.IO 的方法被调用?那apply方法采用一个返回值的无参数函数(正确吗?)。我想这就是我被困住的地方。有人可以解释一下它的定义吗bufferFile works?


是的,你是对的,差不多了;io.IO.apply使用所谓的“按名称”参数调用,该参数基本上是一个不带任何内容的函数(Unit)并返回A。最酷的事情是当你传递一个实例时A直接喜欢new BufferedReader(new FileReader(f)),它将被转换为类似的东西() => new BufferedReader(new FileReader(f)).

后果apply你得到一个实例IO[BufferedReader]它定义了一个方法def unsafePerformIO它只是返回捕获的实例BufferedReader.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

帮助我理解这段 Scala 代码:scalaz IO Monad 的相关文章

  • 具有定期更新的静态数据集的结构化流

    将流媒体与静态数据集合并是结构化流媒体的一个重要功能 但在每个批次中 数据集都会从数据源刷新 由于这些源并不总是那么动态 因此在指定的时间段 或批次数 内缓存静态数据集会提高性能 在指定的时间段 批次数之后 将从源重新加载数据集 否则从缓存
  • 如何强制 Spark 执行代码?

    我如何强制 Spark 执行对 map 的调用 即使它认为由于其惰性求值而不需要执行它 我试过把cache 与地图调用 但这仍然没有解决问题 我的地图方法实际上将结果上传到 HDFS 所以 它并非无用 但 Spark 认为它是无用的 简短回
  • Scala:不变性和路径依赖的类型兼容性

    我围绕这个主题提出了一些问题 但这次我想让它成为一个更一般性的讨论 因为在我看来 Scala 缺少一些非常重要的块 考虑以下代码 从我的真实项目中简化 trait World type State lt StateIntf def evol
  • 带有泛型参数的抽象类的 JsonFormat

    我正在尝试为具有通用参数的抽象类编写 JsonFormat 如下所示 abstract class Animal A def data A def otherStuff String stuff case class CatData cat
  • scalac 编译生成“对象 apache 不是包 org 的成员”

    我的代码是 import org apache spark SparkContext 它可以在交互模式下运行 但是当我使用 scalac 编译它时 出现以下错误消息 对象 apache 不是包 org 的成员 这似乎是路径的问题 但我不知道
  • 在 scalaz 中免费实施

    Haskell 中的免费实现是 data Free f a Pure a Free f Free f a 而 Scalaz 中的实现是 sealed abstract class Free S A private case class Re
  • Scala 中 Null/Nothing/Unit 的用法

    我刚刚读过 http oldfashionedsoftware com 2008 08 20 a post about nothing http oldfashionedsoftware com 2008 08 20 a post abou
  • 如何在 Scala 用户定义注释中使用命名参数?

    在下面的代码中 我能够获得第一个注释对象 Publishable 但不能获得第二个 第二个使用命名参数 它转换为 x 2 x 3 x 1 作为 AST 中的参数 我该如何正确地做到这一点 class Publishable val path
  • Scala 中的数字格式?

    我有一个从文件中读取的动态变化的输入 数字是Int or Double Scala 为什么要打印 0每次之后Double数字 Scala 有没有办法以与读取相同的方式打印它 Example var x Double 1 println x
  • 将 Apache Flink 与 Lagom 结合使用时出现 java.io.NotSerializedException

    我正在 Lagom 的微服务实现中编写 Flink CEP 程序 我的 FLINK CEP 程序在简单的 scala 应用程序中运行得非常好 但是当我在 Lagom 服务实现中使用此代码时 我收到以下异常 拉戈姆服务实施 override
  • Scala Continuations - 为什么我的转移调用不能位于 try-catch 块内?

    我对 Scala 延续很陌生 而且对一般的 scala 语言也比较陌生 我尝试使用 Scala 延续并编写了以下代码 case class MyException msg String extends Exception def go In
  • 为什么类型级计算需要 Aux 技术?

    我很确定我在这里遗漏了一些东西 因为我对 Shapeless 还很陌生并且我正在学习 但是 Aux 技术实际上是什么时候required 我看到它是用来暴露type通过将其提升为另一个 同伴 的签名来声明type定义 trait F A t
  • 为什么Scala语言中的++:运算符这么奇怪?

    我正在使用 运算符来获取两个集合的集合 但是我使用这两种方法得到的结果不一致 scala gt var r Array 1 2 r Array Int Array 1 2 scala gt r Array 3 scala gt r res2
  • 为什么“private val”和“private Final val”不同?

    我曾经以为private val and private final val是一样的 直到我看到 Scala Reference 中的第 4 1 节 常量值定义的形式为 final val x e 其中 e 是常量表达式 第 6 24 节
  • 如何从 Scala repl 中取消导入隐式?

    是否可以从 repl 中取消导入隐式内容 说我做这样的事情 scala gt import scala math BigInt import scala math BigInt scala gt implicits 2 implicit m
  • 简单的 Scala actor 问题

    我确信这是一个非常简单的问题 但很不好意思地说我无法理解它 我有一个 Scala 值列表 我想使用演员来并行地对每个值进行一些 外部 调用 我想等到所有值都已处理完毕 然后继续 没有共享值被修改 有人可以建议吗 Thanks Scala 中
  • 将无形状 HList 转换为 TupleN,其中元组形状不需要与 HList 形状完全匹配

    我想创建相当于 def toTupleN A1 AN L lt HList l L TupleN A1 AN 代码使用toTupleN仅当恰好有一个时才应该编译N中的值的组合l可以从中创建元组 其他任何内容都应该生成编译时错误 应考虑可用的
  • 《使用 Apache Flink 进行流处理》如何从 IntelliJ 运行书籍代码?

    如中所述这个帖子 https stackoverflow com questions 61043860 how to run first example of apache flink我无法成功运行 使用 Apache Flink 进行流处
  • Spark:用列的平均值替换数据框中的空值

    如何创建 UDF 以编程方式将每列中 Spark 数据框中的空值替换为列平均值 例如 在示例中 数据 col1 空值的值为 2 4 6 8 5 5 5 示例数据 col1 col2 col3 2 null 3 4 3 3 6 5 null
  • 如何在Dotty中使用given?

    我在看Dotty下的文档Contextual Abstractions页面 我看到了Given Instances 给定实例 或者简单地 给定 定义了 规范 值 用于合成给定子句的参数的某些类型 例子 trait Ord T def com

随机推荐

  • WCF 服务库与类库项目类型

    WCF 服务库有哪些常规类库不具备的功能 编辑 我发布了我自己的答案 我错过了什么吗 它们从根本上来说只是添加了一些模板类的类库吗 我创建了两者并进行了比较 这就是我发现的 WCF服务库 添加对的引用System Runtime Seria
  • XSLT命名空间和默认命名空间问题[重复]

    这个问题在这里已经有答案了 我是 XSLT 转换的新手 我的输出 xml 中存在名称空间映射问题 输入 XML 是
  • 无法解析的标识符 NavigationButton 错误

    我是 swiftUI 的新手 只是想了解基础知识 我只是想创建一个新视图和一个将移动到该视图的按钮 当我使用下面的代码时 会出现错误 使用未解析的标识符 NavigationButton 尽管该错误是由 Xcode 生成的 import S
  • 在 SwiftUI 中使用选项卡栏弹出到根视图

    在 SwiftUI 中 有没有办法像大多数 iOS 应用程序一样通过点击选项卡栏来弹出到根视图 这是一个example https i stack imgur com RBEvL gif的预期行为 我尝试使用以编程方式弹出视图simulta
  • 搜索并突出显示 UIView 中呈现的 PDF 中的文本

    我用过眉叶 67b10ed https nodeload github com brow leaves zipball master在 UIView 中渲染 PDF 现在我的需要是搜索并突出显示文本 我已经设法获得 UIView 上文本的确
  • 代码签名错误

    我工作的公司有一个基础应用程序 他们重新设计并出售给不同的企业 我重新设计了该应用程序 并尝试将其上传到他们的帐户 但得到 BEROR Code Sign error The identity iPhone Distribution doe
  • 使用cucumber测试时sql错误无法在事务内启动事务

    我是黄瓜新手 正在学习 BDD 当我尝试填写表单并创建记录时 会显示此 sqlite 错误 尽管当我在浏览器中手动尝试代码时没有错误 我正在使用 Rails 4 这是我的控制器代码 class Admin ItemsController l
  • JSqlParser - 漂亮的打印 where 子句

    我已经开始使用 JSqlParser 我可以解析Where 子句 但我无法进一步使用它 JSqlParser github 链接 https github com JSQLParser JSqlParser 事实上 我曾尝试覆盖访问方法 但
  • 始终返回相同布尔值的 Python 函数

    在函数式编程中有时useful有一个总是返回的函数True or False 对于每个参数 甚至多个参数 某些模块中定义的内置函数或函数是否具有这种确切的行为 我不知道有任何内置的 但你可以将它们定义为 false lambda False
  • 如何在 Eclipse 动态 Web 项目中添加类路径条目作为发布/导出依赖项?

    我使用成功创建了一个项目检票口快速入门 http wicket apache org start quickstart html并通过运行将其转换为 Eclipse 动态 Web 项目 mvn eclipse clean eclipse e
  • 为什么无限递归会导致段错误

    为什么无限递归会导致段错误 为什么堆栈溢出会导致段错误 我正在寻找详细的解释 int f f int main f 每次调用 f 时 都会增加堆栈的大小 这是存储返回地址的位置 以便程序知道 f 完成时要转到哪里 由于您永远不会退出 f 因
  • 文本输入占位符对齐

    对齐 TextInput 组件的占位符文本的最佳方法是什么 我已经尝试使用样式组件 如下所述 似乎没有这方面的属性 render return
  • 使用 pre_save 信号编辑上传的文件(djangos FileField)

    我想在保存之前在字节级别编辑上传的文件 即搜索并删除某个字节序列 我按以下方式设置了 pre save 信号 class Snippet models Model name models CharField max length 256 u
  • 用日期和星座填充二维数组的更好方法

    我正在解决以下问题 我想填充一个二维 365 2 数组 第一个值应该保存日期 从 1 月 1 日开始 到 12 月 31 日结束 第二个值应该包含每个日期相应的星座 e g array 0 0 持有 101 并且array 0 1 持有白羊
  • Scala 等待 future 序列

    我希望像下面这样的代码会等待两个 future 但事实并非如此 object Fiddle val f1 Future throw new Throwable baaa emulating a future that bumped into
  • XCode 服务器:打开模块“MobileCoreServices”的导入文件:权限被拒绝

    在 XCode 8 中运行机器人并使用 Swift 3 代码时 我收到此错误 打开模块 MobileCoreServices 的导入文件 权限被拒绝 我用的是迦太基 我在同一台计算机上使用另一个用户帐户运行 macOS 服务器 有人可以帮忙
  • SQLite 尝试写入只读数据库错误

    我有一个填充 SQLite 数据库的控制台应用程序 当应用程序自行运行时 我不会收到任何错误 如果我运行应用程序的多个实例 其中每个应用程序都位于自己的文件夹中 并且每个应用程序填充自己的数据库 我偶尔会遇到以下异常 System Data
  • Nodejs 使用 Loop 下载多个文件时丢失数据

    今天 我尝试从我的服务器下载许多文件 下载 js function getPhotos req res Get User Photos var fileReader fs readFile data user json utf8 funct
  • 使用 boot2docker 从主机共享代码目录不会在来宾上调用 inotify

    我正在尝试使用 boot2docker Virtualbox 设置开发环境 与 docker 容器共享主机上的文件夹是可行的 但由于它是通过 Virtualbox 共享文件夹共享的 所以 inotify 不会在容器内部触发 并且不会重新加载
  • 帮助我理解这段 Scala 代码:scalaz IO Monad

    这是我试图理解的代码 它来自http apocalisp wordpress com 2010 10 17 scalaz tutorial enumeration based io with iteratees http apocalisp