查看完整版本 : Currying (f: X->Y->Z->W)

xianrenb 2017-12-13 09:21 AM

Currying (f: X->Y->Z->W)

以前看不明那些 functional programming 中的 X->Y->Z->W 是搞什麼。
現在有個新看法,與大家分享一下。

大概了解的是 function ,即 f: X->Y :
[url=https://en.wikipedia.org/wiki/Function_(mathematics)]https://en.wikipedia.org/wiki/Function_(mathematics)[/url]
及 Currying ,即 [url=https://en.wikipedia.org/wiki/Currying]https://en.wikipedia.org/wiki/Currying[/url] 兩種概念。
不過 Wikipedia 還是說得難以理解。

前者好簡單, function f 即取 x 做 input , y 做 output 。
後者亦其實不太難,如果 x, y 做 input 要 output f(x,y) 的話,如果 x 已知,可以看成是另一個 function ,以 y 做 input ,出 Hx(y) 亦即是 Y -> F(x,y) 的輸出,例如 x = 1 時, output 應為 f(1, y) 。
亦即是原先的 function 可以看成是 x 做 input , 取得 Y -> F(x, y) 後,再輸入 y ,就取得輸出 f(x, y) 了。
表示的形式,就是 f: (X -> (Y -> F(x,y))) 。
而又因為這個 -> 符號,是 right-associative ,所以亦即是 f: X->Y->F(x,y) 。

還有一個很重要的重點,就是如 X->Y->Z->W 中的 W ,在 define function 時要考慮,但應用時是沒有 w 的。
概念上可以這樣看:
define 個 function 時,等於建立一個不實在的 table 。
如果輸入 x, y, z , 輸出 w 的話, w 可看成是等於 f(x, y, z)。
如:
x  y  z  w=f(x,y,z)
1  1  2  3
1  1  3  4
1  2  4  5
1  2  5  6
2  3  6  7
2  3  7  8
3  4  8  9
3  4  9  10

應用時,輸入 x=1 , y=2 , z=5 ,就是想輸出是 w=6 。
而這個表,可以看成是:
x  y  g
1  1  G1,1(z)
1  2  G1,2(z)
2  3  G2,3(z)
3  4  G3,4(z)
當中 G1,2(z) 的表,就是
z  w
4  5
5  6
所以先查表,得出 G1,2(z) ,再查表輸入 z=5 ,就得出 w=6 。
如此類推。
所以 f: X->Y->Z->W ,應用時是 f x y z ,就會出 w 。
最後那個 w ,處理上與前面的 x 、 y 、 z 不同。
就是這個不同之處,我以前一直搞到個 concept 好亂。

[[i] 本帖最後由 xianrenb 於 2017-12-14 08:25 PM 編輯 [/i]]

Susan﹏汪汪 2017-12-13 09:28 AM

以前的swift有呢類語法
[code]func curried(x: Int)(y: String) -> Float {
    return Float(x) + Float(y)!
  }[/code]

不過廢除左
https://github.com/apple/swift-evolution/blob/master/proposals/0002-remove-currying.md

Susan﹏汪汪 2017-12-13 09:44 AM

[attach]7672065[/attach]

darigold 2017-12-14 01:24 PM

有一點需要講清楚少少…

a: X->Y->Z 說明的是 a 是一個由 X 這個 set map to (Y->Z) 這個 Set 的一個 function。
而 a(x) 裏面的小寫 x 是大寫 X 裏面的一個值。
set 同 value 要分清楚,正如 Int 和 2一樣。

除左呢一點之外,對 currying 的解釋寫得不錯。

Susan﹏汪汪 2017-12-14 01:37 PM

有睇過有人講過

currying不是為functional programming 而出現

而係當一個語言把function 視為first-class citizen
currying 就自然會存在

xianrenb 2017-12-14 08:26 PM

[quote]原帖由 [i]darigold[/i] 於 2017-12-14 01:24 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=472375708&ptid=27119232][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
有一點需要講清楚少少…

a: X->Y->Z 說明的是 a 是一個由 X 這個 set map to (Y->Z) 這個 Set 的一個 function。
而 a(x) 裏面的小寫 x 是大寫 X 裏面的一個值。
set 同 value 要分清楚,正如 Int 和 2一樣。
... [/quote]

謝謝,先前沒有注意這一點。
原文已修改。
頁: [1]
查看完整版本: Currying (f: X->Y->Z->W)