2016-12-02 48 views
3

我想部分应用一个函数。有没有标准简洁的方法来做Elixir的任何一种卷曲?Elixir中是否有标准的咖喱()函数?

我知道我可以做出头这样的:

new_func = fn(arg2, arg3) -> my_func(constant, arg2, arg3) end 

new_func2 = fn -> my_func2(constant) end 

但它看起来丑陋。

+1

你见过这个博客帖子? http://blog.patrikstorm.com/function-currying-in-elixir –

+0

谢谢。正如我们所看到的,我其实正在寻找更简单的东西,即关闭。关于咖喱,这篇文章是1,5岁,所以我不确定它仍然是实际的。 – raacer

回答

5

您可以使用捕捉&操作员清理了一下:

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

+0

谢谢!这看起来更好,但由于某种原因它不适用于func/1。这段代码“create_named_window =&create_window(title)”会产生CompileError:“无效的参数为&,期望格式为&Mod.fun/arity,&local/arity或者包含至少一个参数的捕获为&1,got:create_window title)“ – raacer

+1

@raacer当你使用捕获操作符时,你必须至少有一个参数,所以你可以'&create_window(&1)',但不像你上面那样。 – greggreg

+1

另外你在你的评论中描述的不是一个curried函数,它是一个闭包。您没有创建部分函数应用程序,而是满足了所有参数,并试图在范围内用'title'调用它。你想要的是'fn - > create_window(title)end',因为它专门用于创建闭包。即使在像哈斯克尔这样着名的咖喱语言中,你上面描述的咖喱味道也不存在。 – greggreg