【问题标题】:What does ?=> mean in Scala??=> 在 Scala 中是什么意思?
【发布时间】:2021-10-24 02:47:06
【问题描述】:

我已经看到 ?=> 符号出现在 Scala 代码和一些关于 Scala 3 的讨论帖子中,所以我假设它是 Scala 3+ 符号。通过文档或 Google 搜索时什么都没有出现,但它看起来像是 Function 类型的语法糖,所以它可能与类型和函数有关。什么意思?

【问题讨论】:

  • 我的另一个支持。 Scala 3 文档还没有完全到位,并且在最初的 dotty 提议与实际将其纳入语言的内容之间有些难以导航。在这个时候,这绝对是一个非常合理的问题。
  • 在某些时候,有人需要写一篇关于 Scala 3 中不同函数的好博客文章。有普通函数类型、上下文函数类型、依赖函数类型和多态函数类型。虽然从类型理论的角度来看它们都非常酷(而且一种通用的非纯学术语言设法实现它们真的很神奇),但我希望看到一篇关于实际应用程序的写得很好的帖子每种类型。

标签: scala function types symbols scala-3


【解决方案1】:

(a: A, b: B, ..., z: Z) ?=> R 类型基本上意味着(using a: A, b: B, ..., z: Z) => R(我相信后一种语法在某一时刻有效,但现在不再有效)。当您使用?=> 时,所有这些参数都将成为隐式参数。类似地,函数字面量(a, b, ..., z) ?=> ... 使该函数的所有参数都隐式化,并且它们可以在以后隐式传递给其他方法。

这是一个示例 (Scastie):

case class Foo(s: String)
case class Bar(i: Int)

def baz(xyzzy: (Foo, Bar) ?=> String): Unit =
  val foo = Foo("waldo")
  val bar = Bar(2)
  println(xyzzy(using foo, bar))

baz 采用上下文函数。注意xyzzy 是如何使用与普通方法相同的语法调用的而不是像 Scala 2 中那样简单地 blah(bleh, bluh))。

这是我们调用baz 的一种方式,通过定义一个带有隐式参数的方法:

def foobar(using Foo, Bar) =
  val foo = summon[Foo]
  val bar = summon[Bar]
  s"Method - foo: $foo, bar: $bar"

baz(foobar)

我们也可以传入一个函数字面量。没有常规参数,所以它看起来有点像按名称参数。由于文字的 (Foo, Bar) ?=> 类型,存在 FooBar 的隐式实例。

baz {
  val foo = summon[Foo]
  val bar = summon[Bar]
  s"Function literal - foo: $foo, bar: $bar"
}

您还可以在函数文字本身中使用?=> 来命名隐式参数,而无需调用它们并将它们分配给值。由于它们是隐式的,因此您也可以从上面调用 foobar,因为隐式 FooBar 可用(尽管没有显式命名参数,您也可以在第二个示例中执行此操作)。

baz { (foo: Foo, bar: Bar) ?=>
  val fromMethod = foobar
  s"Explicit context function literal - foo: $foo, bar: $bar; $fromMethod"
}

【讨论】:

  • 这在 Scala 2 中是如何表示的? Foo => Bar 会和 Scala 2 类型系统中的 Foo ?=> Bar 一样吗?
  • 我认为在 Scala 2 中没有一种简单的方法可以在不使用带有两个隐式参数的方法制作 trait ContextFunction2[A, B] 的情况下做到这一点。
猜你喜欢
  • 2023-03-27
  • 2014-01-16
  • 1970-01-01
  • 2011-12-17
  • 2012-01-14
  • 2013-08-05
  • 2014-05-06
  • 2015-12-30
  • 1970-01-01
相关资源
最近更新 更多