如何在Elixir中将范围传递给Enum.filter?

如何在Elixir中将范围传递给Enum.filter?,elixir,Elixir,是否可以将范围传递给Elixir的Enum.filter。例如 这很有效 [1,2,3,4,5] |> Enum.filter(&rem(&1,2)==0) #=> [2,4] 但事实并非如此 [1..10] |> Enum.filter(&rem(&1,2)==0) #=> bad argument in arithmetic... 我有一个列表,其中包含我希望传递给筛选器的范围。例如 [1..10, 2, 3] 您不需要将其包装在

是否可以将范围传递给Elixir的
Enum.filter
。例如

这很有效

[1,2,3,4,5] |> Enum.filter(&rem(&1,2)==0) #=> [2,4]
但事实并非如此

[1..10] |> Enum.filter(&rem(&1,2)==0) #=> bad argument in arithmetic...
我有一个列表,其中包含我希望传递给筛选器的范围。例如

[1..10, 2, 3]

您不需要将其包装在
[]

iex(1)> 1..10 |> Enum.filter(&rem(&1,2)==0)
[2, 4, 6, 8, 10]
[1..10]
是长度为1的列表,第一个元素等于范围
1..10


要过滤包含数字和范围的列表,我将使用
Enum.flat\u map
如下所示:

iex(2)> [1..10, 2, 3] |> Enum.flat_map(fn
...(2)>   n when is_number(n) -> if rem(n, 2) == 0, do: [n], else: []
...(2)>   enum -> Enum.filter(enum, &rem(&1, 2) == 0)
...(2)> end)
[2, 4, 6, 8, 10, 2]

您不需要将其包装在
[]

iex(1)> 1..10 |> Enum.filter(&rem(&1,2)==0)
[2, 4, 6, 8, 10]
[1..10]
是长度为1的列表,第一个元素等于范围
1..10


要过滤包含数字和范围的列表,我将使用
Enum.flat\u map
如下所示:

iex(2)> [1..10, 2, 3] |> Enum.flat_map(fn
...(2)>   n when is_number(n) -> if rem(n, 2) == 0, do: [n], else: []
...(2)>   enum -> Enum.filter(enum, &rem(&1, 2) == 0)
...(2)> end)
[2, 4, 6, 8, 10, 2]

如果要在创建可读性范围时使用括号,只需使用
()

在您的示例中,最具可读性的解决方案是:

# declare anonymous function for checking is number even
is_even = &rem(&1,2) == 0
(1..10) |> Enum.filter(&is_even.(&1))

如果要在创建可读性范围时使用括号,只需使用
()

在您的示例中,最具可读性的解决方案是:

# declare anonymous function for checking is number even
is_even = &rem(&1,2) == 0
(1..10) |> Enum.filter(&is_even.(&1))

啊,这是有道理的。但是如何将列表传递给具有范围元素的过滤器呢?e、 g.这是我的列表
list=[1..10,2,3]
,我想像上面一样进行筛选。你可以使用
Enum.to_list(1..10)+[2,3]
将其转换为一个平面列表,并传递该列表,或者切换到
Enum.flat_map
并在该列表中运行
Enum.filter
,如果该项是一个范围,则返回
[]
[x]
如果项是一个数字。我添加了第二种方法的实现。啊,这很有意义。但是如何将列表传递给具有范围元素的过滤器呢?e、 g.这是我的列表
list=[1..10,2,3]
,我想像上面一样进行筛选。你可以使用
Enum.to_list(1..10)+[2,3]
将其转换为一个平面列表,并传递该列表,或者切换到
Enum.flat_map
并在该列表中运行
Enum.filter
,如果该项是一个范围,则返回
[]
[x]
如果项是一个数字。我已经添加了第二个方法的实现。在第二个方法中,您只需执行
|>Enum.filter(is_偶数)
:)@多伯特:如果你能在第二个例子中没有
&,&1
的情况下,为它的工作提供一些指导,我将不胜感激。我的意思是什么时候我需要
&
,什么时候我不需要?@Bala
Enum.filter
需要一个匿名函数,即
fn。。。结束
&
语法用于将模块的函数转换为匿名函数。在这种情况下,
是偶数
已经是一个匿名函数
&是偶数。(&1)
是冗余的,相当于只
是偶数
。不过,它只在匿名函数只接受一个
参数时才起作用。无论是否使用管道运算符,在使用fn和多个参数时都不能应用此规则。@PatNowak啊,是的,这是部分应用程序,即使有匿名函数,也需要使用
&
语法。请注意,这确实有效:
add=fnx->fny->x+yend;(1..5)|>Enum.map(add.(1))|=>[2,3,4,5,6]
。在第二种方法中,您只需执行
|>Enum.filter(是偶数)
)@多伯特:如果你能在第二个例子中没有
&,&1
的情况下,为它的工作提供一些指导,我将不胜感激。我的意思是什么时候我需要
&
,什么时候我不需要?@Bala
Enum.filter
需要一个匿名函数,即
fn。。。结束
&
语法用于将模块的函数转换为匿名函数。在这种情况下,
是偶数
已经是一个匿名函数
&是偶数。(&1)
是冗余的,相当于只
是偶数
。不过,它只在匿名函数只接受一个
参数时才起作用。无论是否使用管道运算符,在使用fn和多个参数时都不能应用此规则。@PatNowak啊,是的,这是部分应用程序,即使有匿名函数,也需要使用
&
语法。请注意,这确实有效:
add=fnx->fny->x+yend;(1..5)|>Enum.map(add.(1))|=>[2,3,4,5,6]