如何在Elixir中将范围传递给Enum.filter?
是否可以将范围传递给Elixir的如何在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] 您不需要将其包装在
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
的情况下,为它的工作提供一些指导,我将不胜感激。我的意思是什么时候我需要&
,什么时候我不需要?@BalaEnum.filter
需要一个匿名函数,即fn。。。结束
。&
语法用于将模块的函数转换为匿名函数。在这种情况下,是偶数
已经是一个匿名函数&是偶数。(&1)
是冗余的,相当于只是偶数
。不过,它只在匿名函数只接受一个参数时才起作用。无论是否使用管道运算符,在使用fn和多个参数时都不能应用此规则。@PatNowak啊,是的,这是部分应用程序,即使有匿名函数,也需要使用&
语法。请注意,这确实有效:add=fnx->fny->x+yend;(1..5)|>Enum.map(add.(1))|=>[2,3,4,5,6]
。在第二种方法中,您只需执行|>Enum.filter(是偶数)
)@多伯特:如果你能在第二个例子中没有&,&1
的情况下,为它的工作提供一些指导,我将不胜感激。我的意思是什么时候我需要&
,什么时候我不需要?@BalaEnum.filter
需要一个匿名函数,即fn。。。结束
。&
语法用于将模块的函数转换为匿名函数。在这种情况下,是偶数
已经是一个匿名函数&是偶数。(&1)
是冗余的,相当于只是偶数
。不过,它只在匿名函数只接受一个参数时才起作用。无论是否使用管道运算符,在使用fn和多个参数时都不能应用此规则。@PatNowak啊,是的,这是部分应用程序,即使有匿名函数,也需要使用&
语法。请注意,这确实有效:add=fnx->fny->x+yend;(1..5)|>Enum.map(add.(1))|=>[2,3,4,5,6]
。