gpt4 book ai didi

scala - 如何像这样简化scala的函数文字?

转载 作者:行者123 更新时间:2023-12-04 16:15:28 24 4
gpt4 key购买 nike

我是 scala 的新手,并试图编写一个函数文字来检查给定的整数是否为奇数。
我的第一次尝试是:
val isOdd = (x:Int) => (x & 1) == 1
它工作得很好,而且由于参数 x 在这个函数文字中只出现一次,我很想使用“_”符号来进一步简化它,如下所示:
val isOdd = ((_:Int) & 1 ) == 1
但是这次编译器提示:

警告:使用 `==' 比较新对象将始终产生错误
val isOdd = ((_:Int) & 1 ) == 1

这个警告是什么意思?为什么编译器会识别 ((_ :Int) & 1)作为新对象而不是导致值的按位运算?有没有办法使用“_”符号来编写这个函数文字?

最佳答案

问题基本上是Scala需要区分

val isOdd = ((_:Int) & 1 ) == 1

您希望等号右侧的所有内容都是 lambda,并且
val result = collection.map( _ + 1 )

你只希望括号内的东西是 lambda

Scala 已经决定,当您使用下划线创建 lambda 时,它将选择最里面的一组括号作为该 lambda 的边界。有一个异常(exception): (_:Int)不算最里面的括号,因为它的目的只是将它们的类型声明与 _ 分组。占位符。

因此:
val isOdd = ((_:Int) & 1 ) == 1
^^^^^^^^^^^^^^
this is the lambda

val result = collection.map( _ + 1 )
^^^^^^^
this is the lambda

val result = collection.map(( _ + 1) / 2)
^^^^^^^^
this is the lambda
and the compiler can't infer the type of the _

val result = somemap.map(( _ + 1) / 2 * _)
^^^^^^^^
this is an inner lambda with one parameter
and the compiler can't infer the type of the _
^^^^^^^^^^^^^^^^^
this is an outer lambda with one parameter

最后一种情况让您可以执行以下操作
_.map(_ + 1)

并把它翻译成
x => x.map( y=> y + 1 )

关于scala - 如何像这样简化scala的函数文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4725492/

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