簡體   English   中英

在Scala中調用咖喱方法

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

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