从列表理解中返回任何内容

时间:2017-11-27 17:21:35

标签: for-loop elixir list-comprehension return-value side-effects

假设您有以下列表理解:

for i <- 2..n |> Enum.map(&(&1*&1+ &1), i <= :math.sqrt(n), do
  Refrigerator.put(pid, i, "this is my food")
end

是否有惯用的方法来禁用返回结果理解?

对于这样的情况,我对返回的理解不感兴趣,但for使副作用函数生成所需的参数非常容易。

2 个答案:

答案 0 :(得分:2)

如果这是关于为大n建立回报的内存消耗,我想你也想避免Enum.map超过2..n

您是否尝试过使用Streams?

2..n
|> Stream.map(& &1*&1 + &1)
|> Stream.filter(& &1 <= :math.sqrt(n))
|> Enum.each(& Refrigerator.put(pid, &1, "this is my food"))

答案 1 :(得分:1)

我不能说这是多么惯用,但如果你担心效率,你总是可以制作一个实现Collectable的结构,但实际上并没有做任何工作

defmodule NoCollect do
  defstruct []
end

defimpl Collectable, for: NoCollect do
  def into(pool) do
    {pool, fn
      expr, {:cont, _} -> expr
      expr, :done -> expr
      _   , :halt -> :ok
    end}
  end
end

然后就可以这样使用

for ..., into: %NoCollect{} do
  # ...
end

然后你在技术上仍然会得到一个理解对象,但现在它将是一个微不足道的%NoCollect{}对象,无论循环运行多少次,而不是实际累积然后丢弃值。