我想部分应用一个函数。有没有标准简洁的方法来做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