6

當我遇到這個函數的需求時,我正在玩弄一些函數式編程,但是我不知道標準命名法中這種東西被稱爲什麼。 任何人都認可它?叫做什麼功能「模式」?

function WhatAmIDoing(args...) 
    return function() 
     return args 
    end 
end 

編輯:廣義的功能,它需要的參數變量量(或者可能是隱式的列表),並返回一個函數,當調用返回所有指定參數時,像咖喱或泡菜,但它似乎也不是。

+0

我不認爲我會稱它爲一種模式,而不是如果語句是模式。模式通常可以解決特定的問題。這只是一個非常基礎的語言結構。你只是有一個返回閉包的高階函數。 – jalf 2009-01-14 13:01:04

+0

什麼是上下文?我們談論的代碼有多少?只是內部函數能夠訪問外部定義的變量嗎?這只是一個封閉。還是你能夠返回嵌套函數?這只是高階函數的一個屬性。 – jalf 2009-01-14 13:08:22

回答

10

WhatAmIDoing是higher-order function,因爲它是一個返回另一個函數的函數。

它返回的是一個thunk —爲延遲計算實際值而創建的閉包。通常創建thunk是爲了懶惰地評估一個表達式(並可能記住它),但在其他情況下,只需要一個函數來代替裸價值,就像在「constantly 5」的情況下那樣,在某些語言中返回一個函數總是返回5.

後者可能適用於給定的例子,因爲假設語言是按照應用順序進行評估的(即在調用函數之前計算參數),函數除了將值轉換爲函數之外沒有其他目的返回它們。

WhatAmIDoing實際上是我描述的「不斷」函數的實現。但總的來說,你不必在內部函數中返回args。你可以返回「ackermann(args)」,這可能需要很長的時間,如...

function WhatAmIDoing2(args...) 
    return function() 
     return ackermann(args) 
    end 
end 

但WhatAmIDoing2將立即返回,因爲阿克曼函數的評價將在closure暫停。 (是的,即使是按價值計算的語言。)

-2

代表?

基本上你正在返回一個函數?或函數的輸出?

聽不懂,對不起......

+0

這不是你平常的C#的東西。函數式編程是一個完全不同的世界,函數返回函數 – 2009-01-14 12:34:32

+0

弗雷德裏克是正確的,它不是通常的東西,但我也不知道要在我正在做的事上寫一個名字,儘管這似乎是一件有用的事情 – 2009-01-14 12:36:11

4

我要說的是XXXX返回綁定上的X,Y和Z值的匿名函數的關閉

wikipedia製品可以闡明一些

5

在函數編程一個函數,另一個函數作爲參數或返回另一個函數稱爲higher-order function

2

Currying是關於將函數轉換爲函數鏈,每個函數只接受一個參數並返回另一個此類函數。所以,這個例子與currying沒有關係。

酸洗是通常用來表示某種序列化的術語。可能用於存儲由多個值構建的對象。

如果您感興趣的方面是返回的函數可以訪問XXXX函數的參數,那麼我會使用Remo.D.

1

正如其他人所說,這是一個higher-order function。由於您在問題中有「模式」,因此我想補充一點,這種功能語言的功能通常使用strategy pattern以不具有高階功能的語言進行建模。

1

非常類似的東西是用Clojure稱爲constantly

http://github.com/richhickey/clojure/blob/ab6fc90d56bfb3b969ed84058e1b3a4b30faa400/src/clj/clojure/core.clj#L1096

只有那constantly回報需要的參數任意數量的功能,使其成爲更普遍的(靈活),比你的格局。

我不知道,如果這種模式有一個名稱,但會在正常功能的情況下,預計使用它,但我關心的是一定值返回:

(map (constantly 9) [1 2 3]) 
=> (9 9 9) 

只是想知道,你用這個做什麼?