我想部分應用一個函數。有沒有標準簡潔的方法來做Elixir的任何一種捲曲?Elixir中是否有標準的咖喱()函數?
我知道我可以做出頭這樣的:
new_func = fn(arg2, arg3) -> my_func(constant, arg2, arg3) end
new_func2 = fn -> my_func2(constant) end
但它看起來醜陋。
我想部分應用一個函數。有沒有標準簡潔的方法來做Elixir的任何一種捲曲?Elixir中是否有標準的咖喱()函數?
我知道我可以做出頭這樣的:
new_func = fn(arg2, arg3) -> my_func(constant, arg2, arg3) end
new_func2 = fn -> my_func2(constant) end
但它看起來醜陋。
您可以使用捕捉&
操作員清理了一下:
plus2 = &Kernel.+(2, &1)
plus2.(4)
6
注意在PLUS2之間的點.
和它的括號
由於這是一種語法糖
plus2 = fn(right) -> Kernel.+(2, right) end
所有相同的規則適用。就像你必須將所有參數提供給你正在「捲曲」的函數一樣,你可以按任意順序放置位置參數。
文檔:http://elixir-lang.org/docs/stable/elixir/Kernel.SpecialForms.html#&/1
謝謝!這看起來更好,但由於某種原因它不適用於func/1。這段代碼「create_named_window =&create_window(title)」會產生CompileError:「無效的參數爲&,期望格式爲&Mod.fun/arity,&local/arity或者包含至少一個參數的捕獲爲&1,got:create_window title)「 – raacer
@raacer當你使用捕獲操作符時,你必須至少有一個參數,所以你可以'&create_window(&1)',但不像你上面那樣。 – greggreg
另外你在你的評論中描述的不是一個curried函數,它是一個閉包。您沒有創建部分函數應用程序,而是滿足了所有參數,並試圖在範圍內用'title'調用它。你想要的是'fn - > create_window(title)end',因爲它專門用於創建閉包。即使在像哈斯克爾這樣着名的咖喱語言中,你上面描述的咖喱味道也不存在。 – greggreg
你見過這個博客帖子? http://blog.patrikstorm.com/function-currying-in-elixir –
謝謝。正如我們所看到的,我其實正在尋找更簡單的東西,即關閉。關於咖喱,這篇文章是1,5歲,所以我不確定它仍然是實際的。 – raacer