Scalaz:“scalaz.syntax.applicative._”如何发挥其魔力

2024-01-24

这个问题与this one https://stackoverflow.com/questions/38524384/reader-monad-in-scala-return-local-and-sequence,我试图了解如何在 Scala 中使用 reader monad。

在答案中,作者使用以下代码来获取实例ReaderInt[String]:

import scalaz.syntax.applicative._
val alwaysHello2: ReaderInt[String] = "hello".point[ReaderInt]

Scala 使用哪些机制来解析表达式的类型"hello".point[ReaderInt]以便它使用正确的point功能?


每当您尝试解决此类问题时,最好的第一步是使用反射 API 来对表达式进行脱糖:

scala> import scalaz.Reader, scalaz.syntax.applicative._
import scalaz.Reader
import scalaz.syntax.applicative._

scala> import scala.reflect.runtime.universe.{ reify, showCode }
import scala.reflect.runtime.universe.{reify, showCode}

scala> type ReaderInt[A] = Reader[Int, A]
defined type alias ReaderInt

scala> showCode(reify("hello".point[ReaderInt]).tree)
res0: String = `package`.applicative.ApplicativeIdV("hello").point[$read.ReaderInt](Kleisli.kleisliIdMonadReader)

(你通常不想使用scala.reflect.runtime在真实代码中,但对于这样的调查来说非常方便。)

当编译器发现你试图调用.point[ReaderInt]在没有 a 的类型上point方法——在本例中String- 它开始寻找隐式转换来转换String转换为具有匹配的类型point方法(这在 Scala 中称为“丰富”)。从输出中我们可以看到showCode它找到的隐式转换是一个名为的方法ApplicativeIdV in the applicative语法对象。

然后将这个转换应用到String,产生一个类型的值ApplicativeIdV[String]。这种类型的point方法如下所示:

def point[F[_] : Applicative]: F[A] = Applicative[F].point(self)

这是这样的语法糖:

def point[F[_]](implicit F: Applicative[F]): F[A] = F.point(self)

所以接下来需要做的就是找到一个Applicative实例为F。在你的情况下,你已经明确指定了F is ReaderInt。它将别名解析为Reader[Int, _],它本身就是一个别名Kleisli[Id.Id, Int, _],并开始寻找实例。

它首先看到的地方之一将是Kleisli伴生对象,因为它需要一个包含以下类型的隐式值Kleisli,事实上showCode告诉我们它找到的是Kleisli.kleisliIdMonadReader。到那时就完成了,我们得到了ReaderInt[String]我们要。

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

Scalaz:“scalaz.syntax.applicative._”如何发挥其魔力 的相关文章

随机推荐

  • 如何在ionic 2中的选择项目中加载数据并知道所选项目?

    我目前的尝试如下 页面 html
  • 使用 Joi 验证时剥离未知键

    我正在使用 Joi 验证服务器中的 JavaScript 对象 架构如下 var schema Joi object keys displayName Joi string required email Joi string email e
  • 使用 geopandas 绘制热图 (kdeplot)

    我将以下数据存储在geopandas DataFrame目的 geometry是多边形并且x是我想用作热度的值 id geometry x 9 01001 POLYGON 102 10641 22 06035 102 10368 22 0
  • 如何根据数字是正数还是负数应用不同的格式

    我正在输出一个Double可以是 也可以是负值 如果数字是负数 则会自动包含符号 是否也可以对正数执行此操作 我能做到这一点的唯一 可怕的 方法是 If MyNumber lt 0 then string Format 0 0 00 MyN
  • Richedit 样式格式自行更改

    如果您能更好地理解和定义我的问题 请有人编辑标题 我遇到的问题是 RichEdit 的样式格式 恢复 回默认的 无 即 然后回到我设置的任何内容 例如粗体或斜体 有问题的事情 我认为 因为我不知道它是如何破坏事情的 是一个过程 REMain
  • 想要一个正则表达式来验证印度车牌号格式吗?

    这里的大家好 我需要建立一个与车辆登记相关的摆动应用程序 我想在其中输入印度标准的车辆号码 例如 MP 09 AB 1234 啊 17 英尺 2387 UT 32 DR 6423 DL 01 C AA 1111 进一步来说 请问有人可以帮助
  • 为什么Windows中的BOOL是int类型?

    为什么不定义BOOL as an enum像 enum BOOL FALSE TRUE 有什么理由吗BOOL必须指定明确地 as int 或任何其他整数类型 来自 Raymond Chen 关于此主题的博客文章 BOOL 与 VARIANT
  • 指令中的媒体播放器对象

    我正在尝试使用指令来访问 flowplayer 媒体播放器 这样父控制器就可以广播事件 然后播放器只需使用侦听器响应这些事件 事件正在工作 但播放器未定义 因此没有真正工作 我的问题是 1 播放器未初始化 我一定没有正确设置它 2 我希望播
  • 根据复选框的状态切换文本框的可见性 -jQuery

    我早些时候在这方面得到了一些帮助 但不知何故我无法再让它工作了 如果选中 其他 复选框 我需要出现一个文本框 如果未选中该文本框 则该文本框消失 有谁知道什么给
  • Rails:按名字和姓氏进行高效搜索

    我正在尝试创建一个按名称匹配用户的 搜索框 困难在于用户同时具有名字和姓氏 其中每个都可以有空格 例如 Jon Bon Jovi 或 Neil Patrick Harris 我想知道确保搜索是在两个名字的串联上进行的最有效方法和姓氏字段 用
  • 未捕获的类型错误:无法读取未定义的属性“服务器”

    我正在尝试在开发 Chrome 扩展时利用 SignalR 我可以跑sample http www asp net signalr overview signalr 20 getting started with signalr 20 tu
  • 重写 Flask add_url_rule 以路由特定 URL

    我在 Flask 中使用基于类的视图来创建 CRUD REST API 并使用以下命令注册路由add url rule像这样 class GenericAPI MethodView def get self item group item
  • 如何均匀平衡多行文本?

    我想显示一小段可能换行为两行或三行的文本 它位于一个高度视觉化的元素内 出于样式目的 我希望线条的长度尽可能相等 更喜欢一根线而不是两根线 而不是这个 这是将一段文本换行为两个的示例 lines 我要这个 这是一个例子 将换行为两行的文本
  • 在 PySide6 中使用 GraphicalEffects

    我正在使用 PySide6 并尝试使用 GraphicalEffects 模块 根据此处的文档 https doc qt io qt 6 qtgraphicaleffects5 index html https doc qt io qt 6
  • 动画排序堆积条形图 d3.js

    我想要制作一种堆积条形图的动画这个图表 http bl ocks org mbostock 3886208参数如下这个图表 http bl ocks org mbostock 3885705 我成功地对 x 轴进行了排序 但我没有成功地移动
  • 错误:phonegap 中缺少 config.xml

    我的电话间隙有问题 我正在phonegap 中开发一个项目 几天前它就已经运行了 现在 当我尝试运行同一个应用程序时 我得到了 ERROR config xml is missing Add res xml plugins xml to y
  • NumPy 中的索引:访问所有其他组的值

    The n numpy 中的索引选项提供了一种非常有用的方法来索引列表中的每个第 n 项 但是 是否可以使用此功能来提取多个值 例如所有其他pair的价值观 例如 a np array 0 1 2 3 4 5 6 7 8 9 10 11 我
  • Mongoose 查询大于或小于某个日期的嵌套文档

    如何查询大于或小于特定日期的评论 这是我的带有帖子模型和评论模型的架构 var mongoose require mongoose var should require should mongoose connect localhost t
  • 从 bash 脚本中的 URL 中提取文件名和路径

    在我的 bash 脚本中 我只需要从给定的 URL 中提取路径 例如 从包含字符串的变量 我只想提取到其他变量 one more dir file exe 部分 当然 登录名 密码 文件名和参数是可选的 由于我是 sed 和 awk 的新手
  • Scalaz:“scalaz.syntax.applicative._”如何发挥其魔力

    这个问题与this one https stackoverflow com questions 38524384 reader monad in scala return local and sequence 我试图了解如何在 Scala