簡體   English   中英

Scala中f(a,b)和f(a)(b)之間的差異

[英]Difference between f(a,b) and f(a)(b) in Scala

我對Scala非常新。 我正在閱讀Paul Chiusano和RúnarBjarnason在scala中編寫的一本名為函數式編程的書。 到目前為止,我發現它很有趣。 我看到咖喱和不干擾的解決方案

def curry[A,B,C](f: (A, B) => C): A => (B => C)= {
    a => b => f(a,b)
  }

def uncurry[A,B,C](f: A => B => C): (A, B) => C = {
    (a,b) => f(a)(b)
  }

在庫里,我理解f(a,b)導致C型的值,但是在不合理的情況下,我不理解f(a)(b)。 任何人都可以告訴我如何閱讀f(a)(b)或如何得到一種C或請參考我一些可以向我解釋的在線資料?

謝謝你的幫助。

基本上f(a)的返回類型是B => C的函數,我們可以調用這個結果g 如果然后調用g(b) ,則獲得類型C的值。 f(a)(b)可以擴展為f.apply(a).apply(b)

uncurry方法中,你采用了一個所謂的“curried”函數,這意味着你沒有一個函數來評估n個參數,你有n個函數來評估一個參數,每個函數返回一個新函數,直到你評估最后一個參數。

在沒有語言特定支持的情況下進行干擾意味着您必須執行以下操作:

// curriedSum is a function that takes an integer,
// which returns a function that takes an integer
// and returns the sum of the two
def curriedSum(a: Int): Int => Int = 
   b => a + b

然而,Scala為currying提供了進一步的支持,允許你寫這個:

def curriedSum(a: Int)(b: Int): Int = a + b

在這兩種情況下,您都可以部分應用curriedSum ,獲取一個取整數的函數,並將其與最初傳入的數相加,如下所示:

val sumTwo: Int => Int = curriedSum(2)
val four = sumTwo(2) // four equals 4

讓我們回到你的情況:當我們提到, uncurry需要一個咖喱功能,並把它變成一個普通的功能,也就是說,

f(a)(b)

可以讀作:“將參數a應用於函數f ,然后獲取結果函數並將參數b應用於它”。

如果有人正在尋找解釋。 鏈接更好地解釋了它

def add(x:Int, y:Int) = x + y

add(1, 2)   // 3
add(7, 3)   // 10   

干嘛

def add(x:Int) = (y:Int) => x + y

add(1)(2)   // 3
add(7)(3)   // 10

在第一個示例中,add方法接受兩個參數並返回添加兩個參數的結果。 第二個示例重新定義了add方法,這樣它只需要一個Int作為參數,並返回一個函數(閉包)作為結果。 然后我們的驅動程序代碼調用此函數,傳遞第二個“參數”。 此函數計算值並返回最終結果。

暫無
暫無

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

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