monad 是一种描述操作如何链接在一起的方式。
monad 最常见的形式是将输出从一个函数传递到链中的下一个函数。 Elixir 为此提供了管道操作员|>。然而:
基于OP,不想改变arity:
从未使用过传递给命名函数的原始参数。如果您想保持命名函数的数量,但希望匿名函数“链接”返回值,您可以这样实现非匿名函数:
defmodule MonadTest do
def return(s), do: fn -> s end
end
f = MonadTest.return(1)
f.()
或者,您可以像在帖子中那样匿名使用该功能:
defmodule MonadTest do
def return(s), do: fn -> s end
end
f = &MonadTest.return/1
f.(1).()
我认为我们可以澄清两件事。 (1)是&<NamedFunction>/<arity>语法,二是参数是如何传递的。
语法&MonadTest.return/1 将生成一个匿名函数,它与命名函数MonadTest.return 的定义相同。
这通常在将命名函数作为参数传递时使用,例如如果您需要在可枚举方法中使用 MonadTest.return/1,例如 Enum.map(1..5, &MonadTest.return/1)。
在我的示例中,我不会将参数传递给命名函数,因为您将其传递给新定义的 MonadTest.return/0 内的匿名函数。
出于您的目的,您可能不需要生成匿名函数,而是可以直接引用命名函数:
defmodule MonadTest do
def return, do: fn s -> s end
end
f = MonadTest.return
f.(12)
如果您确实需要 MonadTest 是匿名的,则需要调用它,然后将参数传递给嵌套在其中的匿名函数。
defmodule MonadTest do
def return, do: fn s -> s end
end
f = &MonadTest.return/0
f.().(12)