?=> 在 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) ?=>
类型,存在 Foo
和 Bar
的隐式实例。
baz
val foo = summon[Foo]
val bar = summon[Bar]
s"Function literal - foo: $foo, bar: $bar"
您还可以在函数文字本身中使用?=>
来命名隐式参数,而无需调用它们并将它们分配给值。由于它们是隐式的,因此您也可以从上面调用 foobar
,因为隐式 Foo
和 Bar
可用(尽管没有显式命名参数,您也可以在第二个示例中执行此操作)。
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 中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章