C#有匿名代理。所以,我可以寫:F#塊參數
public vois foo(string d, Action t){
t();
}
在紅寶石:
def foo d
yield
end
如何做到在F#一樣的嗎?首選語法是:
foo "dfdfdf" { do something here }
感謝
C#有匿名代理。所以,我可以寫:F#塊參數
public vois foo(string d, Action t){
t();
}
在紅寶石:
def foo d
yield
end
如何做到在F#一樣的嗎?首選語法是:
foo "dfdfdf" { do something here }
感謝
你的第一個例子是不是一個匿名方法 - 它只是路過,並通過委託調用(這可能是指一個命名或匿名方法) 。在F#做到這一點,只需提供和調用一個函數參數:
let foo n f = f n
let square n = n * n
let result = foo 123 square
printfn "%A" result
要建立在F#中的匿名方法是等效的,使用的樂趣關鍵字:
let result2 = foo 123 (fun n -> n * n)
當然不是。它是razer消費者的匿名方法。無論如何,謝謝你的解決方案。 – 2009-11-08 18:53:06
open System
// create a function that expects an Action delegate and executes it
let foo (actionDelegate:Action) (s:String) = actionDelegate.Invoke();
// create a function that meets Action delegate
let ActionFunction param = Console.Write("Action in action")
// call foo passing ActionFunction
foo (new Action(ActionFunction)) "my string"
好吧,我不看如何使用.NET操作。這就是爲什麼我也參考ruby的例子。 – 2009-11-08 18:54:17
看一看這篇文章約Higher Order Functions in F#。高階函數是接受其他函數作爲參數的函數,聽起來就像您所描述的概念。
我認爲你沒有明確表達你的觀點。你的foo函數在你的c#和ruby實現中是不同的。那麼你的問題是什麼?你不知道如何將委託傳遞給函數並執行它? – 2009-11-08 18:51:50
他們實際上是一樣的。它們是接受兩個論點的函數。首先是字符串d,第二個是可執行代碼。對於C#示例,這是通過Action完成的(因此它接受匿名方法)。對於ruby而言,只是隱式的塊執行(yield會執行一些你會作爲第二個參數傳遞的東西) – 2009-11-08 19:00:32
奇怪的使用「yield」keywork :)。現在我明白了。 – 2009-11-08 19:07:21