在JavaScript中有一種叫做俄羅斯娃娃模式的模式(這也可以稱爲「一次性」)。基本上,這是一個功能,在某些時候可以用另一種替代。如何在Ocaml中實現俄羅斯娃娃模式?
簡單的例子:
var func = function(){
func = function(){ console.log("subsequent calls call this...");};
console.log("first call");
}
所以第一次調用FUNC它會輸出「第一個電話」和下一個(次及以後),它的打印「後續調用調用這個......」。 (例如,在Scheme中也很容易做到這一點)
我一直在困惑於如何在Ocaml中做到這一點?
編輯:一個解決方案,我想出來的:
let rec func = ref(fun() -> func := (fun() -> Printf.printf("subsequent..\n"));Printf.printf("First..\n"));;
古稱: FUNC();;有趣的是,如果我在定義中不包含'rec',它就不會調用後續函數......它總是打印'First ...'。
這就是......錯了。 – phooji 2011-03-20 21:32:55
請注意,下面提出的OCaml解決方案與您的JavaScript示例一樣「清潔」,因爲它們封裝了「func」的可變性:第一次調用後,函數被更改爲良好,沒有人可以訪問引用來更改它背部。這是通過將「f」引用局部用於「玩偶」調用來完成的。當然,如果您希望提及的內容仍然可以修改,那也是可以的。 – gasche 2011-03-21 13:59:49