Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala lambda表达式中的奇怪语法_Scala - Fatal编程技术网

Scala lambda表达式中的奇怪语法

Scala lambda表达式中的奇怪语法,scala,Scala,上面代码中的a>是什么?它与a>有何不同?(假设a是某个预定义的值)我认为它实际上是完全相同的。它一点也不不同,只是一个较短的版本 val (xa, xb) = xs partition ( a > ) 任何希望函数具有某个参数的方法都可以传递一个单参数方法,如果类型正确,该方法将自动转换 因此,这些都是有效的: scala> val a = 10 a: Int = 10 scala> val xs = List(1, 2, 3, 4, 5, 11, 12, 13, 14,

上面代码中的
a>
是什么?它与
a>有何不同?(假设a是某个预定义的值)

我认为它实际上是完全相同的。

它一点也不不同,只是一个较短的版本

val (xa, xb) = xs partition ( a > )

任何希望函数具有某个参数的方法都可以传递一个单参数方法,如果类型正确,该方法将自动转换

因此,这些都是有效的:

scala> val a = 10
a: Int = 10

scala> val xs = List(1, 2, 3, 4, 5, 11, 12, 13, 14, 15)
xs: List[Int] = List(1, 2, 3, 4, 5, 11, 12, 13, 14, 15)

scala> val (xa, xb) = xs partition ( a > )
xa: List[Int] = List(1, 2, 3, 4, 5)
xb: List[Int] = List(11, 12, 13, 14, 15)
因此,要么
a
定义了方法
,要么可以使用
方法将其隐式转换为某物。例如,这项工作:

class C { def go(i: Int) = -i }
val c = new C
List(1,2,3).foreach( println )
List(1,2,3).map( c go )
因为(编辑:有人会认为这是真的……)有一个从
Int
RichInt
的隐式转换(与提供
.toFloat
等的相同),并且
RichInt
定义了一个
方法
partition
需要一个函数,该函数接受
Int
并返回
Boolean
2>
是一个接受
Int
并返回
Boolean
的方法。所以转换是自动进行的

(编辑:但正如@Lukas Rytz指出的,这甚至比这更棘手,因为编译器意识到它可以专门处理基元int,所以即使
不是对象
2
上的方法,因为
2
不是对象,基元没有方法,编译器也认识到遵从
RichInt
的速度会慢一些。所以,实际上,它只是用正确的字节码编写了一个方法。)


只有在正确的转换不是自动发生的情况下(例如,由于模糊性,或者因为您希望将其分配给变量),才需要使用
\uuu
从方法中创建函数。(然后并不总是很清楚您是使用
\uu
从方法转换为函数,还是使用
\u
作为输入的占位符;幸运的是,结果是相同的。)

yiack这是我不喜欢scala的地方:(这种语法在Scala中并不常见,imho。最近它似乎越来越流行了——我也加入了其中。不过,它看起来很像Haskell,在那里这将是非常标准的。@OscarRyz:你不喜欢什么?减少语法混乱,还是强大的类型推断?@Missiong Faktor。意想不到的黑魔法。我不喜欢如果明天有人说:
xs partition-
做同样的事情,或者
partition\u xs
或者
a xs-pttin
或者别的什么,我也不会感到惊讶,因为当我想我了解一点Scala的时候,一个新的习惯用法就出现了,并且改变了一切。在寻找能力的过程中,Scala支持几乎所有的语法。这就是我不知道的我不太喜欢它,我发现它很不一致。我知道你认为不同,这没关系。这不完全正确,没有隐式转换。
Int
类有一个
成员(事实上还有一个
toFloat
)。键入后的示例是
不可变的。this.List.apply[Int](1,2,3)。分区({((x$1:Int)=>2.>(x$1));
@Lukas——事实上——编译器魔法又在欺骗我了。因为,当然,
Int
不是一个真正的类。对于scala编译器,
Int
是一个带有真正方法的真正的类(例如
),特殊情况是后端生成字节码以使用基元操作,而不是生成方法调用。值类没有源文件这一事实是历史性的,最近有人试图改变这一点,请参阅。这可能最终使其成为主干。@Lukas-我不是说Scala编译器不在最终使用一个类来跟踪Int的运行情况,只是对编码者和字节码来说
2
不是一个类。例如,尝试执行
2。getClass
。尝试更改为使用源代码时出现的问题列表也突出了如何处理特殊的原语。没错,值类型不是类类型。谢谢你清理这个。
List(1,2,3).partition(2 >)