gpt4 book ai didi

scala - 为什么 circe `or` 函数(显然是一元函数)与需要二元操作的 reduceLeft 一起工作?

转载 作者:行者123 更新时间:2023-12-05 08:50:00 25 4
gpt4 key购买 nike

A 和我正在用 circe 做一些工作来编码/解码一些 ADT,我们遇到了一些我们根本不理解的功能。 circe 文档中给出的示例按预期工作,但在深入研究后 - 尚不清楚解码示例工作的原因,因此我们很难推理如何在需要时进行修改。

功能(来自 Circe Examples about ADTs ):

import cats.syntax.functor._
import io.circe.{ Decoder, Encoder }, io.circe.generic.auto._
import io.circe.syntax._

object GenericDerivation {
// Encoder Redacted

implicit val decodeEvent: Decoder[Event] =
List[Decoder[Event]](
Decoder[Foo].widen,
Decoder[Bar].widen,
Decoder[Baz].widen,
Decoder[Qux].widen
).reduceLeft(_ or _)
}

我明白了 - 基本上从这个列表中选择第一个可用的解码器 - 有道理但是(!)

or 似乎是一个采用名称参数的一元函数。类型签名是:

final def 或[AA >: A](d: => Decoder[AA]): Decoder[AA]

reduceLeft(来自 IterableOnce)需要二元函数。类型签名是:def reduceLeft[B >: A](op: (B, A) => B): B

然后我的大脑爆炸了。我显然遗漏了一些东西,无法弄清楚。

该示例最明确地适用于转换 ADT。鉴于 函数似乎不符合 reduceLeft 所需的类型,为什么/如何工作?

最佳答案

or 是一个参数的方法,但不要忘记this

decoder1.or(decoder2)(又名decoder1 或decoder2)是关于decoder1decoder2.

+ 也是一个 method of one parameter

final abstract class Int private extends AnyVal {
...

/** Returns the sum of this value and `x`. */
def +(x: Int): Int

...
}

但您仍然可以添加两个 Int:1 + 1 又名 1.+(1)

所有的方法都有一个多于其签名中列出的“参数”,即this

(所有普通参数都是静态解析的,this是动态解析的。)

关于scala - 为什么 circe `or` 函数(显然是一元函数)与需要二元操作的 reduceLeft 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63058328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com