[英]Calling a curried method in Scala
當我定義一個咖喱函數像:
def fx(x: Int) (f: Int => Int): Int = f(x)
我可以使用以下方式調用它:
fx(2)(x => x * x)
但不能使用以下方式調用它:
(fx 2) (x => x * x)
如果我們從scala std庫中獲得帶有簽名的foldLeft樂趣:
def foldLeft[B](z: B)(f: (B, A) => B): B
我可以使用以下方式調用它:
(xs foldLeft 0 ) ( _ + _)
但不能使用以下方式調用它:
xs foldLeft (0) ( _ + _)
為什么要是我定義了樂趣,我可以使用f(x)(fx)
來調用,而不能使用(fx)(fx)
來調用,但是在foldleft
情況下,我可以使用(obj fx)(fx)
但無法使用obj f (x) (fx)
調用它?
提示:我知道這是因為運算符優先,但是需要詳細的答案
在您的示例中,您未在固定位置使用fx
。 infix中的函數或運算符需要一個實例,在該實例中,該函數或運算符的左側被調用,而右邊的參數被調用。
例:
(xs foldLeft 0 ) ( _ + _)
在xs
(左)(這是一些Collection )上調用foldLeft
(中綴),將0
(右)作為參數傳遞。
在您的示例中:
(fx 2) (x => x * x)
調用fx
的對象丟失。 如果您稍微更改一下示例,它會起作用:
object someInstance {
def fx(x: Int)(f: Int => Int): Int = f(x)
val test = (this fx 2) (x => x * x)
}
// OR
val test2 = (someInstance fx 2) (x => x * x)
會的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.