[英]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.