Elixir is#u integer()不';不能使用Enum.all?

Elixir is#u integer()不';不能使用Enum.all?,elixir,Elixir,这里没有什么长生不老药。我的问题是: 使用Enum.all?/2函数时,我们传递一个函数作为第二个参数: iex(19)> is_int = &(is_integer(&1)) iex(20)> Enum.all?(list, is_int) true 那么,为什么我不能直接传递is\u integer iex(21)> Enum.all?(list, is_integer) ** (CompileError) iex:21: undefined functi

这里没有什么长生不老药。我的问题是:

使用
Enum.all?/2
函数时,我们传递一个函数作为第二个参数:

iex(19)> is_int = &(is_integer(&1))
iex(20)> Enum.all?(list, is_int)
true
那么,为什么我不能直接传递
is\u integer

iex(21)> Enum.all?(list, is_integer)
** (CompileError) iex:21: undefined function is_integer/0
    (stdlib) lists.erl:1354: :lists.mapfoldl/3
    (stdlib) lists.erl:1355: :lists.mapfoldl/3

是不是整数
不是函数?从错误中看起来是这样的。我们在那里看到的
mapfoldl
是什么?

您可以直接使用
is\u integer
函数

Enum.all?(列表,fn(i)->is_integer(i)end)

这也在起作用


Enum.all?(list,&(is_integer(&1))
您必须捕获此函数。使用:

Enum.all?(list, &(is_integer(&1))

Elixir就是所谓的Lisp-2语言-常规函数(通常称为命名函数)和捕获为值的函数(通常称为匿名函数)占用不同的空间,调用方式不同,使用的运算符也不同

使用
def
defp
创建命名函数,并使用括号调用命名函数,例如
foo()

使用
&
运算符将命名函数转换为匿名函数,例如
x=&foo/1

使用
fn
创建匿名函数,并在括号前面使用
调用,例如
foo.(


匿名函数的值与所有其他值一样-整数、映射等,因此您可以将它们作为所有其他值传递。命名函数只能调用或转换为匿名函数,不能直接传递。

将匿名函数绑定到现有函数时,这三个函数相等:

is_int = fn n -> is_integer(n) end
is_int = &is_integer(&1)
is_int = &is_integer/1
最后一个是最简洁的,因为它只需要函数名和arity

注意,由于内核模块中的函数是在启动IEx时自动导入的,因此上述匹配实际上是错误的

is_int = &Kernel.is_integer/1
在这种情况下,使用捕获操作符
&
捕获命名函数后,可以将其传递给任何需要函数作为参数的函数。或者直接传递捕获的函数

Enum.all?(list, is_int)
Enum.all?(list, &is_integer/1) 

但这正是我发布的第一个案例中发生的情况。我的问题是,为什么写
is\u integer
不管用?哇,真管用!但最后需要一个
。这是什么?为什么需要它?更重要的是,当匿名函数被分配给变量时,为什么不需要它呢?捕获操作符将函数捕获为匿名函数。更多信息:.
Enum.all?(列表,&is\u integer/1)
您可以使用此表单,比如更具可读性且无需大量
。哇!这是非常有趣的事情。谢谢分享!你会推荐一些关于语言理论的轻量级文章吗?:-)没问题!谢谢你的来访!:-)我喜欢你解释的方式