首页 > 解决方案 > Scalaz 隐式分辨率混淆

问题描述

我遇到了 Scalaz 的情况,这让我有点困惑。假设我们定义了以下类型。

import scalaz.*
import Scalaz.*

type Example[A] = Unit \/ Success[A]

case class Success[+A](val exampleField: A)

ExampleleftUnit或 right也是如此Success[A],其中Success一个A.

现在,我想编写一个函数,它基本上是 Scalaz 的一元绑定运算符 on Example

def doBind[A, B](a: Example[A])(f: Success[A] => Example[B]): Example[B] =
  a.flatMap(f)

看起来很棒。ScalaflatMap基本上是一元绑定操作符,这都是类型检查。

但是,如果我尝试在此处使用 Scalaz>>=绑定运算符,如下所示

def doBind[A, B](a: Example[A])(f: Success[A] => Example[B]): Example[B] =
  a >>= f

然后我们得到

[error] 12 |  a >>= f
[error]    |  ^^^^^
[error]    |  value >>= is not a member of com.mercerenies.fictional.Example[A].
[error]    |  An extension method was tried, but could not be fully constructed:
[error]    |
[error]    |      scalaz.Scalaz.ToBindOpsUnapply[com.mercerenies.fictional.Example[A]](a)(
[error]    |        scalaz.Unapply.unapplyMAB1[TC, M0, A0, B0](scalaz.\/.DisjunctionInstances1[Nothing])
[error]    |      )

另一方面,如果我们删除并且Success我们的Example直接权A

type Example[A] = Unit \/ A

def doBind[A, B](a: Example[A])(f: A => Example[B]): Example[B] =
  a >>= f

然后是>>=作品。Success那么,如果我们有一个围绕我们的值的案例类包装器,为什么它不起作用呢?我的理解是>>=来自 的隐含实例BindOps,那么为什么它在这种A情况下有效,但在这种情况下无效Success[A]

使用 Scalaz 7.4.0-M7 运行 Scala 3.0.0。

标签: scalamonadsimplicitscalaz

解决方案


推荐阅读