Scala 中的 Reader monad:返回、本地和序列

2024-04-26

我正在使用ReaderScala 中的 monad 由scalaz https://github.com/scalaz/scalaz图书馆。我对这个单子很熟悉正如 Haskell 中定义的 https://wiki.haskell.org/All_About_Monads#The_Reader_monad。问题是我找不到相当于的功能return, local, and sequence(除其他外)。

目前我使用的结构是我不喜欢的,因为我在重复自己或者让我的代码有点晦涩。

关于return,我目前正在使用:

Reader{_ => someValue}

我宁愿只使用像这样的构造unit(someValue),但我在互联网上找不到任何东西。有类似的教程this one http://blog.originate.com/blog/2013/10/21/reader-monad-for-dependency-injection/使用上述方法,我认为这不是最佳方法。

关于local我还必须做类似的事情:而不是输入类似的内容:local f myReader我必须展开它的定义:

Reader{env => myReader.run(f(env))

最后,序列有点接近我的预期(作为一个使用 Scala 的 Haskell 难民):

readers: List[Reader[Env, T]]
readerTs: Reader[Env, List[T]] = readers.sequenceU

我对这个实现的问题是,对于 Scala 来说相对较新,sequenceU

final class TraverseOps[F[_],A] private[syntax](val self: F[A])(implicit val F: Traverse[F]) extends Ops[F[A]] {
    //...
    def sequenceU(implicit G: Unapply[Applicative, A]): G.M[F[G.A]]

看起来相当晦涩难懂,看起来就像黑魔法。理想情况下我想使用sequence对 Monad 的操作。

scalaz 或类似库上是否有更好的将这些结构翻译为 Scala 的方法?我没有与任何 Scala 函数库结婚,因此任何使用其他库的解决方案都可以,尽管我宁愿使用 scalaz 得到答案,因为我已经使用它实现了我的代码。


为了让事情变得简单,我填写了一些类型。将它们更改为具有泛型类型的 def 应该仍然有效。 我还提取了ReaderInttype,以避免与 lambda 类型混淆。

返回/纯/点

Scala 没有自动类型类解析,因此您需要隐式提供它们。为了Kleisli(作为读者的 monad 转换器),Kleisli[Id, ?, ?]足够

 implicit val KA = scalaz.Kleisli.kleisliIdApplicative[Int]
 type ReaderInt[A] = Kleisli[Id.Id, Int, A]

 val alwaysHello = KA.point("hello")  

或使用导入的语法:

  import scalaz.syntax.applicative._  
  val alwaysHello = "hello".point[ReaderInt]

所以作为一般规则,你

1)导入应用实例,通常位于scalaz.std.something.somethingInstance

2) import scalaz.syntax.something._

3)然后你可以写x.point[F], where F是你的应用。

local

不确定它是否回答了你的问题,但是Kleisli has a local method.

val f: String ⇒ Int = _.length
val alwaysEleven = alwaysHello local f

测序

同样的,你可以自由选择使用syntaxfor 或 显式指定类型类。

  import scalaz.std.list.listInstance
  val initial: List[ReaderInt[String]] = ???  
  val sequenced: ReaderInt[List[String]] = Traverse[List].sequence[ReaderInt, String](initial) 

  import scalaz.syntax.traverse._
  val z = x.sequence[ReaderInt, String]    

我宁愿不使用sequenceU,它使用Unapplytypelcas 来推断G类型,因为有时 scala 很难找出正确的类型。 而且我个人并不觉得自己输入一些类型很混乱。

可能值得研究一下cats https://github.com/typelevel/cats,虽然还没有太多。

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

Scala 中的 Reader monad:返回、本地和序列 的相关文章

  • 在自己的定义中使用变量?

    无限流 val ones Stream Int Stream cons 1 ones 一个值怎么可能在它自己的声明中使用呢 看起来这应该会产生编译器错误 但它确实有效 它并不总是递归定义 这实际上有效并产生 1 val a Int a 1
  • 返回元组的第一个元素

    假设我创建一个将两个整数相加的函数 def addInt a Int b Int Int Int val x a b x 2 我回来了 result 2 故意为了这个问题 现在我想创建一个仅返回 x 的变量 val result addIn
  • 如何在play 2.0模板中格式化数字/日期?

    我在使用 play 2 0 模板系统时遇到了一些困难 我有一个方法返回 scala 中的 Int 我想使用模式 对其进行格式化 我努力了 order itemCount format and order item count format
  • Scala - 获取给定年份的所有月份和日期

    我需要创建一个函数 以字符串日期三元组 年 月 日 的形式返回给定年份的所有日期的序列 def allDaysForYear year String get every month and day for that year 然后我会这样使
  • 使用Log4j在日志中输出Spark应用程序id

    我有一个用于 Spark 应用程序的自定义 Log4j 文件 我想输出 Spark 应用程序 ID 以及消息和日期等其他属性 因此 JSON 字符串结构如下所示 name time date level thread message app
  • 如何在使用 Json4s 序列化期间重命名字段?

    如何轻松重命名 json4s 中的字段名称 从他们的文档中 我尝试了以下代码片段 但它似乎没有重命名serial字段到id case class Person serial Int firstName String val rename F
  • Spark:有没有办法打印出spark-shell和spark的类路径?

    我可以在 Spark shell 中成功运行 Spark 作业 但是当它打包并通过 Spark submit 运行时 我收到 NoSuchMethodError 这向我表明类路径存在某种不匹配 有没有办法可以比较两个类路径 某种日志记录语句
  • 一般重写 Scala 案例类

    是否可以通用地替换案例类中的参数 更具体地说 假设我想要一个接收 查找 案例类和 替换 案例类 如语法规则的左侧和右侧 以及目标案例类的替代函数 并且该函数将返回将查找案例类的参数替换为替换案例类的新案例类 该函数还可以简单地采用一个案例类
  • 如何在 Scala 中操作 JSON AST

    我正在尝试 json4s 库 基于 lift json 我想做的一件事是将 JSON 字符串解析为 AST 然后对其进行操作 例如 我想更新插入一个字段 如果该字段不存在 则将该字段插入到 AST 中 如果存在 则更新其值 我无法在文档中找
  • 使用 vs code,如何让 scala 格式工作并格式化我的代码?

    我的多项目 sbt 存储库中有 scala 格式插件 addSbtPlugin org scalameta sbt scalafmt 2 3 2 所以在 sbt 控制台中如果我运行 scalafmt 它工作正常 我的 build sbt 有
  • for-yield-getOrElse 是 Scala 的范例还是有更好的方法?

    基本上我想提取一堆选项 a b 等 这是在 Scala 中执行此操作的最佳方法吗 对于我来说 括号中的 for yield 看起来有点令人困惑 for a lt a b lt b c lt c yield getOrElse 尝试使用map
  • GHC 可以为 monad 转换器派生 Functor 和 Applicative 实例吗?

    我正在尝试实施MaybeT本着mtl图书馆 使用这个非编译解决方案 LANGUAGE FlexibleInstances MultiParamTypeClasses UndecidableInstances import Control M
  • Scala 中两个地图的交集和合并/连接

    假设我有两张类似这样的地图 val m1 Map 1 gt One 2 gt Two 3 gt Three val m2 Map 2 gt 2 0 3 gt 3 0 4 gt 4 0 我想根据键获取交集并返回一个表示合并值的元组 结果看起来
  • 如何更改 SparkContext.sparkUser() 设置(在 pyspark 中)?

    我是新来的Spark and pyspark 我使用 pyspark 之后我rdd处理中 我试图将其保存到hdfs使用saveAsTextfile 功能 但我得到一个 没有权限 错误消息 因为 pyspark 尝试写入hdfs使用我的本地帐
  • Scala 对大数的阶乘有时会崩溃,有时不会

    以下程序经过编译和测试 有时返回结果 有时充满屏幕 java lang StackOverflowError at scala BigInt apply BigInt scala 47 at scala BigInt equals BigI
  • 案例类和案例对象之间的区别?

    我正在学习 Scala 和 Akka 并且在最近的查找中solution https stackoverflow com questions 22770927 waiting for multiple results in akka 我发现
  • Scala SBT 和 JNI 库

    我正在编写一个简单的应用程序Scala通过以下方式使用 leveldb 数据库leveldbjni图书馆 我的build sbt文件看起来像这样 name Whatever version 1 0 scalaVersion 2 10 2 l
  • 用于真实 Web 项目的 Scala-JS [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有人用过吗Scala JS在真实的网络项目中 但不仅仅适用于普通的JavaScript在隔离环境中替换 我想尽可能多地使用 Scala 我希望可
  • Scala 2.10,它对 JSON 库和案例类验证/创建的影响

    显然 在 Scala 2 10 中我们得到了改进的反射 这将如何影响 lift json jerkson sjson 和朋友 此外 我们能否期望在不久的将来 Scala 中会出现内置的 JSON 语言功能 如 Groovy 的出色 GSON
  • 使用 Promise 语法编写同步代码有什么好处吗?

    有同步承诺这样的概念吗 使用 Promise 语法编写同步代码有什么好处吗 try foo bar a b bam catch e handleError e 可以写成类似的东西 但使用同步版本then foo then bar bind

随机推荐

  • mysql 查询多边形内的点 - 没有结果

    我很确定我在这里做错了很多事情 但我不确定是什么 该表 减去一些字段 CREATE TABLE IF NOT EXISTS stuff id int 10 unsigned NOT NULL AUTO INCREMENT lat decim
  • 使用标签强制 IE 11“用户代理字符串”

    我的网站在 IE11 中无法正常工作 我们都知道HTML标签允许开发者强制IE兼容模式 在例子中 效果很好 解决了 IE10 的可视化问题 但实际上在 IE11 上 即使Compatibility mode被设定为IE9 User agen
  • 如何使用 Fluent Assertion 比较两个属性不同的集合?

    我有公开课RuleInfo它是从内部类创建的Rule private static RuleInfo CreateRuleInfo Rule r return new RuleInfo RuleCode r RuleId DisplayNa
  • UIScrollView 中的 UIControll 未接收触摸事件

    I use 七开关 https github com bvogelzang SevenSwitch在我的项目中 我需要将其添加到UIScrollView但当我将其添加到滚动视图时 该控件似乎无法接收触摸事件 我尝试过子类化scrollvie
  • 使用媒体编解码器将 PCM 转换为 AAC

    我正在 Android Jelly Bean 中使用媒体编解码器类将 PCM 格式编码为 AAC 该文件已编码 但没有音乐播放器能够播放该文件 我在网上找不到任何工作代码或正确的文档 这是我的代码 public void doConvert
  • 将到期日期作为 TIMESTAMP 列的默认值

    有没有办法将列的默认值设置为过期日期 从CURRENT TIMESTAMP 我已经尝试过 ALTER TABLE table ADD COLUMN expire TIMESTAMP NOT NULL DEFAULT TIMESTAMPADD
  • Chrome 控制台和 Javascript 对象类型

    我想找到 Javascipt 对象的类型 构造函数的名称 但我一直只是用我尝试过的所有方法得到一个通用的 对象 我在网上搜索过 但没有找到对我有用的 Javascript 方法 它始终只返回对象构造函数类型作为通用 对象 然而当我在 Chr
  • Jquery 单击事件不会在使用 jquery 动态创建的元素上触发

    我正在尝试创建一个简单的功能 用户从下拉列表中选择一些值 然后单击 添加 按钮以标签的形式在下面的 div 中添加所选项目 每个添加的标签都有一个删除锚点 单击该锚点即可删除该标签 现在 当单击添加按钮时 标签将被正确插入 但是当我单击标签
  • 如何以编程方式获取 iOS 应用程序中的日志消息?

    我正在使用中定义的方法https developer apple com documentation os logging https developer apple com documentation os logging在 iOS 应用
  • Tic-Tac-Toe AI:如何制作树?

    在制作井字游戏机器人时 我在尝试理解 树 时遇到了巨大的障碍 我理解这个概念 但我不知道如何实现它们 有人可以向我展示一个如何为这种情况生成树的示例吗 或者关于生成树的好教程 我想最困难的部分是生成部分树 我知道如何实现生成整棵树 但不知道
  • ofstream 不适用于 Windows 7 隐藏文件

    我意识到ofstream不适用于 Windows 7 隐藏文件 这是快速测试代码 include
  • 更改 UINavigationController 导航栏的颜色

    我正在尝试使用以下方法更改 UINavigationController 导航栏的颜色 self navigationController navigationBar tintColor UIColor brownColor 在下面给出的代
  • 使用 Xcode 6.4 的通用自定义 iOS 框架

    我使用 Xcode 6 创建了一个自定义 iOS 框架 我尝试了许多脚本来使框架通用 对于模拟器和设备 但它们都不适合我 请建议我一种为 iOS 创建自定义通用框架的方法Xcode 6 要通过终端将两个二进制文件合并为通用二进制文件 首先编
  • Android 将原始字节记录到 WAVE 文件中以进行 Http Streaming

    所以我正在使用AudioRecord从 Android 记录原始字节并将其写入 wav 文件 由于 Android 不支持此功能 我必须使用以下代码手动编写 wav 文件头 randomAccessWriter writeBytes RIF
  • 如何检查 servlet 中的 sessionId 是否有效 (java)

    我在我的 Web 应用程序中维护 sessionid 和 HttpSession 对象的映射 我使用 HttpSessionListener 从地图中填充或删除会话 当我的网络服务器崩溃 宕机并恢复时 我需要一种方法来检查提交的 sessi
  • Android 显示全屏滑块图像

    我有一个在 Android 屏幕上显示的 gridview 图像 我的要求是滑动全屏图像 这是我的代码 图像适配器 public class ImageAdapter extends BaseAdapter private Context
  • 与 WiX 3.0 一起安装 WiX 3.5

    是否可以同时安装 WiX 3 0 和 3 5 如果我在安装 3 0 后安装 3 5 它会删除 3 0 文件 如果我尝试在 3 5 之后安装 3 0 它会告诉我已经安装了较新的版本 我正在从 VS 2008 迁移到 VS 2010 因此我的应
  • 获取已安装应用程序的位置 vb.net

    我在vb net上发布了一个应用程序 用户将能够将应用程序安装在计算机上他们选择的任何位置 或者可能不是他们选择的任何位置 而是默认位置 我如何以编程方式获取用户安装应用程序的位置 换句话说 我需要应用程序知道它从哪里运行 我如何检测到这一
  • Android 使卷轴看起来在旋转的最佳方法

    我正在为 Android 制作一个简单的水果机 老虎机 我在想如何才能让 卷轴 看起来在旋转 然后逐渐停止 我的想法是有一个环绕声 然后在顶部随机生成图像 并沿着屏幕向下移动 只有部分图像可见 任何有关想法或如何完成的帮助都将非常棒 我在这
  • Scala 中的 Reader monad:返回、本地和序列

    我正在使用ReaderScala 中的 monad 由scalaz https github com scalaz scalaz图书馆 我对这个单子很熟悉正如 Haskell 中定义的 https wiki haskell org All