由ReaderT包装的带有Option和Some的Scala理解

亚历山大

这是一个很好的示例:

  import cats.data.ReaderT
  import cats.instances.option._
  ...
  def f1:ReaderT[Option, Service, Int] =
    ReaderT(service => for {
      res <- Some(10)
    } yield res )

这是一个未编译的示例:

  def f2:ReaderT[Option, Service, Int] =
    for {
      res <- ReaderT((_:Service) => Some(10))
    } yield res

我收到以下错误:

错误:(53,11)找不到参数F的隐式值:cats.Functor [Some] res <-ReaderT((:Service)=> Some(10))错误:( 53,11 )没有足够的参数作为方法映射:(隐式F:cats.Functor [Some])cats.data.Kleisli [Some,com.savdev.Service,Int]。未指定值参数F. res <-ReaderT((:Service)=> Some(10))

要解决第二个示例中的错误,我必须返回not Some,但是返回Option,它是以下项的父级Some

  def f2:ReaderT[Option, Service, Int] =
    for {
      res <- ReaderT((_:Service) => Option(10))
    } yield res

你能解释一下吗?为什么在第一个示例中,return Some(但不是Option)工作正常。为什么在第二个示例中Some同时不返回返回值?Scala编译器是否可以选择编译案例,如第二个示例中所示?或其他解决方案。

安德烈(Andrey Tyukin)
  1. 在第一种情况下,它map直接调用on Some,已知该方法会返回Option(子类Some为的普通多态性Option),然后继续进行查找Functor[Option]

  2. 在第二种情况下,函数的返回类型被推断为Some[Int],并且编译器尝试查找Functor[Some]typeclass的实例以调用方法Reader(具有typeclass的即席多态性Functor),但这失败了,因为没有的函子Some

主要问题在于,这Some不仅是类型实例的构造函数(例如,Option在Haskell中),而且实际上是(主要是无用的)类型实例的构造函数Some,有时会弄乱类型推断/隐式解析度。

如果要强制执行所产生的类型Option[Int],使用Option(10)构造SomeOption.empty构建None

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当包装异常发出消息时,带有Log4j的Slf4j不会打印包装的异常(由)

Akka.NET参与者和包装器(可能带有Rx)

Scala用于理解Future,List和Option

Scala理解期货和期权

带有sbt和scala.swing的NoClassDefFoundError

Python列表理解,带有函数作为输出和条件

带有口味和包装名称的Douts

包装带有图标的单选按钮和另一个图标

bash提示的奇怪包装,并带有着色(正在使用`\ [`和`\]`)

Vim:柔软的包装和带有at标志的长行

通过理解和应用纯净,将ReaderT与Either组合在一起

带有Async和Option的F#程序流程问题

具有自动跨度计数和带有包装内容的物品宽度的回收者视图

在ReaderT上获取带有镜头的元组子集

带有地图和展平的scala并行数组

带有Scala插件,Maven和Spark的Eclipse项目

带有Scala,WebJars,ReactJS和RequireJS的PlayFramework?

带有Selection和Clear Option的DropdownList(Glyphicon删除圆圈)?

Scala的理解和循环

带有 64 位和 32 位 sh 调用的 Sonarqube 包装器语法错误

带有生成器理解的“any”和不带括号的理解之间的区别?

带有 Futures 的服务类和日志记录设计 Scala

带有比较和循环的 Scala 内嵌追加

Scala:使用 ReaderT 和 Option 编写 for-comprehension

带有包装文本和行元素的卡片

如何使用带有 `option` 参数和 `formatCurrency()` 的 `DT::renderDT()`

Scala:if-else 到带有 Option 的声明性代码

Scala - 获取带有条件和 groupBy 的列?

scala:用於理解 Option