gpt4 book ai didi

scala - 是 <- 只能由编译器访问

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

Scala 的 <-箭头似乎有点奇怪。大多数运算符在源代码中的某处实现为函数,直接或隐式定义在数据类型上。 <-另一方面,似乎只能在 for 之外使用。理解,它充当一个句法元素,用于在单子(monad)上下文中表示新变量的绑定(bind)(通过 map )。

这是我能想到的唯一一个例子,其中 Scala 有一个看起来像运算符的语法元素,它只能在特定的上下文中使用,而不是一个实际的函数。

我错了吗<-作品?它是仅由编译器使用的特殊情况符号,还是开发人员在编写自己的代码时可以通过某种方式使用此行为?

例如,是否可以编写一个宏来转换

forRange (i <- 0 to 10) { print(i) } 

进入

{ var i = 0; while (i <= 10) { print(i) } }

而不是其标准map相等的?据我所知,i <- ... 的任何用法在 for 之外context 由于引用了未知值而导致异常。

最佳答案

简而言之,是的 <-是 Scala 中的保留运算符。这是编译器的事情。

Foreach

foreach 之间有很大的区别。和 for yield ,但语法只是语法糖,在编译时转换。

for (i <- 1 to 10) { statement }表达式被翻译成:

Range.from(1, 10).foreach(..)

多个变量: for (i <- 1 to 10; y <- 2 to 100) {..}变成:

Range.from(1, 10).foreach(
el => {Range.from(2, 100).foreach(..)});

所有变体由:

for (x <- someList) = someList.foreach(..) .

简单地说,它们都被脱糖到 foreach陈述。具体foreach被调用由使用的集合给出。

为了产量

for yield语法是 flatMap 的糖和 map . stay in the monad规则在这里适用。

for (x <- someList) yield {..}被翻译成 someList.flatMap(..) .

链式操作成为map/flatMap 的层次链组合:

for {
x <- someList; y <- SomeOtherList
} yield {}
变成:

someList.flatMap(x => {
y.flatMap(..)
});
等等。

重点

关键是 <-运算符只不过是使代码更具可读性的语法糖,但它总是在编译时被替换。

强调 Rob 的观点

Rob 是其他 Scala 语法糖的优秀示例。

上下文绑定(bind)

package somepackage;
class Test[T : Manifest] {}

实际上是翻译成:

class Test[T](implicit evidence: Manifest[T])

作为证明,尝试使用上下文绑定(bind)的类型来别名:

type TestAlias[T : Manifest] = somepackage.Test // error, the : syntax can't be used. .或许很容易看出 : Manifest部分实际上不是类型参数。

输入 class Test[T : Manifest] 更容易而不是 class Test[T](implicit evidence: Manifest[T] .

关于scala - 是 <- 只能由编译器访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20639714/

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