gpt4 book ai didi

Scala 类型参数

转载 作者:行者123 更新时间:2023-12-04 02:26:18 25 4
gpt4 key购买 nike

class OptionLikeMatcher[F[_], T, U](typeName: String, toOption: F[T] => Option[U]) extends Matcher[F[T]] { ... }
case class RightMatcher[T]() extends OptionLikeMatcher[({type l[a]=Either[_, a]})#l, T, T]("Right", (_:Either[Any, T]).right.toOption)
case class LeftMatcher[T]() extends OptionLikeMatcher[({type l[a]=Either[a, _]})#l, T, T]("Left", (_:Either[T, Any]).left.toOption)

有人可以解释一下他们在这里试图用类型参数实现什么吗?toOption: F[T] => Option[U] 参数在用于 RightMatcherLeftMatcher 时具有什么类型?

它来自 Scala Specs2 库。

最佳答案

让我们首先在这里解决最复杂的类型构造函数:

({type l[a]=Either[_, a]})#l

是编码类型 lambdas 的原始方式。它可以更简洁地写成

Either[_, ?]

用投影仪,或作为

[X] =>> Either[_, X]

在 Scala 3 中。它基本上只是选择 Either 的右侧参数作为相关参数,并用通配符替换左侧参数。


现在,OptionLikeMatcher 的三个类型参数是:

  • F[_] - 被匹配事物的类型构造函数;它的行为应该与 Option“有点相似”,即应该有某种方法可以从中获取 Option
  • T 是插入到 F 类型构造函数中的类型; F[T] 一起给出匹配的类型。
  • U 可以被认为是 T 的“轻微扰动”版本;它捕获与 T 基本相同的信息,但在将 F[T] 转换为 Option[U] 时,它允许一些可控的草率(否则,如果需要 F[T] => Option[T],那实际上就等同于要求一种称为自然变换的严格结构 F ~> 选项,在这种情况下可能过于严格)。

将它们放在一起可以得到 RightMatcher:

  • F[A] = Either[_, A] - 即选择 Either 的右参数,忽略左参数
  • OptionLikeMatcher 中的 T 绑定(bind)到 RightMatcher 中的 T
  • OptionLikeMatcher 中的 U 也绑定(bind)到 RightMatcher 中的 T,即可能“稍微perturb"T 在这里没有使用, OptionLikeMatcher 中的 TU 都是由相同的类型实例化的。

因此,RightMatcher 中的 toOption 具有类型 Either[_, T] => Option[T](_:Either[Any, T]).right.toOption 符合 Either[_, T] => Option[T],因为 Any 出现在 Either 中的协变位置,而 Either[Any, T] 出现在函数类型中的逆变位置,因此 Either[ Any, T] => Option[T]Either[_, T] => Option[T] 的子类型,因为它的输入类型更严格,它可以在需要 Either[_, T] => Option[T] 的任何地方使用。


综上所述,我找不到任何 F 的应用程序不是 F[T] 的形状(OptionLikeMatcher 中也没有>, OptionLikeChekedMatcher),仅在以后将它们用作不可分割的单元 F[T]。也许这是在对一些更复杂的结构进行重构后遗留下来的。

关于Scala 类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67357995/

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