scala - Scalaz 隐式分辨率混淆
问题描述
我遇到了 Scalaz 的情况,这让我有点困惑。假设我们定义了以下类型。
import scalaz.*
import Scalaz.*
type Example[A] = Unit \/ Success[A]
case class Success[+A](val exampleField: A)
Example
leftUnit
或 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。
解决方案
推荐阅读
- javascript - NestJS:ValidationPipe 不适用于路由@Param
- python - 动态创建对象又名将字符串转换为python中的类名调用
- python - Python async unitest - 断言 False 不会通过测试
- javascript - 写入时验证输入字段
- thrift - TThreadPoolServer 使用示例
- python - 如何在 Python 中导入 .pyx 文件?
- flutter - 是否可以通过 Flutter 应用锁定 Android 设备?
- cucumber - 我可以重复使用黄瓜/小黄瓜示例块吗?
- unity3d - Canvas Rect Transform 是灰色的,不能移动改变位置。我怎样才能让它能够改变它在编辑器中的位置?
- javascript - JSON 没有被发送到 AJAX POST 请求