2014-10-01 38 views
13

我最近一直在使用F#(我的背景是C#),並正在閱讀網站http://fsharpforfunandprofit.com,我發現這很有幫助。(Kestrel)K-combinator:爲什麼它有用?

我必須http://fsharpforfunandprofit.com/posts/defining-functions/這是關於combinators的部分。我理解他們所有人(儘管Y combinator或Sage鳥用我的心靈擰緊了!),除了紅隼。斯科特Wlaschin給定義(在F#)爲:

let K x y = x 

我不明白任何情況下,這將是有用的。起初,我認爲它可能被用作鏈運算符,以便您可以將值傳遞給函數,然後取回原始值。我寫了這樣的運營商自己之前,但你可以看到它是不一樣的:如果我們部分採用K個組合子(值是5)

let (>|) x f = f x; x 

然後我們回來,忽略其自變量的函數而是返回5.再次,沒有用。

(K 5) = fun y -> 5 

任何人都可以給我一個簡單的例子,這可能會使用嗎?

+1

:D看看這個:https://en.wikipedia.org/wiki/SKI_combinator_calculus - 它真的只是學術上的樂趣 - 即使你在F#中找到一些用途,你也不應該把它叫做'K' ^^ – Carsten 2014-10-01 11:09:18

+1

順便說一句,如果你沒有馬上找到它 - 例如''K''用於在SKI calculuse中實現像布爾值,元組,數字等......(這是一個基本的構建塊;)) - 想一想它作爲一種投影到*第一個組件* – Carsten 2014-10-01 11:11:12

+0

謝謝,我讀過維基百科頁面,但它沒有提供比我已有的更多信息。 – Richiban 2014-10-01 11:13:45

回答

14

這是一個很簡單的例子:

讓我們假設我有一個結構,就像一個列表,我可以映射功能。

let K x y = x 

let lst = [3;5;13;2] 

我可以這樣映射數學函數:

let plus5 = lst |> List.map ((+)5) // instead of writing List.map (fun x -> 5 + x) 
// val plus5 : int list = [8; 10; 18; 7] 

let times3 = lst |> List.map ((*)3) // instead of writing List.map (fun x -> 3 * x) 
// val times3 : int list = [9; 15; 39; 6] 

如果我要地圖常數函數?

let tens = lst |> List.map (K 10) // instead of writing List.map (fun x -> 10) 
// val tens : int list = [10; 10; 10; 10] 

鑑於在FP你通常函數作爲參數傳遞,k的組合子可以讓你用幾個按鍵指定一個常數函數。

+0

感謝Gustavo,這對我也是如此,當我使用'id'的時候也是如此(比如'lst |> sortBy id'),但仍然沒有獲得地圖中常量函數的點。等效的SQL將是'從dbo.Customers中選擇5個'。也許我會繼續思考。 – Richiban 2014-10-01 12:31:33

+0

是的,這在SQL中是相同的,但是在FP中,可以按照可以分開規則評估程序和規則的邏輯的方式組合函數。將規則看作是功能,你可能有一個直接的規則,不需要額外的參數。我偶爾會在這種情況下使用K combinator,以避免重複我的自我寫作「fun x - > something'' – Gustavo 2014-10-01 12:38:36

+0

雖然是真實的,但在真實情況下您將使用更可讀的List .replicate 4 10'(或'10 |>列表。複製4') – Carsten 2014-10-01 12:41:40

相關問題