簡體   English   中英

如何簡化scala的函數文字?

[英]how to simplify scala's function literal like this?

我是scala的新手,並試圖編寫一個函數文字來檢查給定的整數是否為奇數。 我的第一次嘗試是:

val isOdd = (x:Int) => (x & 1) == 1

它工作得很好,而且,由於參數x只在這個函數文字中出現一次,我很想用“_”表示法進一步簡化它,如下所示:

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

但這次編譯器抱怨:

warning: comparing a fresh object using `==' will always yield false
val isOdd = ((_:Int) & 1 ) == 1

這個警告意味着什么? 為什么編譯器將((_ :Int) & 1)識別為新對象而不是導致值的按位運算? 有沒有辦法用“_”表示法編寫這個函數文字?

問題基本上是Scala需要區分它們

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

你希望等號右邊的所有東西都是lambda,而且

val result = collection.map( _ + 1 )

你只希望括號內的東西是lambda

Scala已經決定,當你使用下划線創建一個lambda時,它會選擇最里面的一組括號作為lambda的邊界。 有一個例外: (_: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 )

只是輕微作弊:

val isOdd = (_: Int) % 2 == 1

:-)

你去:

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

Scala正在做的是:

  • 它看到((_:Int) & 1 )並創建一個類型為(Int) => Int的對象,即一個函數。
  • 然后應用比較運算符==將此函數與值1進行比較

函數不等於值1.因此結果為false ,因此您的代碼等效於:

val isOdd = false

你可以做的是創建另一個匿名函數來執行計算的== 1部分。 這很難看:

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

這相當於更詳細(也許更容易理解):

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

一種不同的方法

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM