![](/img/trans.png)
[英]transform 'A => F[G[B]]' into 'F[G[A=>B]' scala
[英]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.