?=> 在 Scala 中是啥意思?

Posted

技术标签:

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

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

【问题讨论】:

docs.scala-lang.org/scala3/reference/contextual/… 我的另一个支持。 Scala 3 文档还没有完全到位,并且在最初的 dotty 提议与实际将其纳入语言的内容之间有些难以导航。在这个时候,这绝对是一个非常合理的问题。 在某些时候,有人需要写一篇关于 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] 的情况下做到这一点。

以上是关于?=> 在 Scala 中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

-> 在 C++ 中是啥意思? [复制]

“==>”在coq中是啥意思?

这个符号在 PHP 中是啥意思 <?=

>& 在命令中是啥意思? [复制]

=> 符号在 Haskell 中是啥意思?

=> 运算符在 Swift 中是啥意思?