Elixir 长生不老药:使用`:into`作为量程生成器(数字)

Elixir 长生不老药:使用`:into`作为量程生成器(数字),elixir,Elixir,让我们看看长生不老药中的以下表达式: iex>对于n,对于n否,into只能用于收集到类型中。整数不可收集 您可以在此处使用Enum.sum/1,但您可能已经知道: iex(1)> Enum.sum(for n <- 1..30, rem(n, 3) == 0, do: n * 10) 1650 编辑:整数可以通过加法来实现Collectable,但我不建议这样做,因为(1)这个实现是全局的,(2)没有明显的方法可以“收集”成整数,你也可以使用乘法而不是加法。不过,为了便于学习,下

让我们看看长生不老药中的以下表达式:


iex>对于n,对于n否,
into
只能用于收集到类型中。整数不可收集

您可以在此处使用
Enum.sum/1
,但您可能已经知道:

iex(1)> Enum.sum(for n <- 1..30, rem(n, 3) == 0, do: n * 10)
1650
编辑:整数可以通过加法来实现
Collectable
,但我不建议这样做,因为(1)这个实现是全局的,(2)没有明显的方法可以“收集”成整数,你也可以使用乘法而不是加法。不过,为了便于学习,下面是如何为具有加法行为的整数实现
可收集的

defimpl Collectable, for: Integer do
  def into(acc) do
    {acc, fn
      acc, {:cont, x} -> acc + x
      acc, _ -> acc
    end}
  end
end

IO.inspect for n <- 1..30, rem(n, 3) == 0, into: 0, do: n * 10

否,
into
只能用于收集到类型中。整数不可收集

您可以在此处使用
Enum.sum/1
,但您可能已经知道:

iex(1)> Enum.sum(for n <- 1..30, rem(n, 3) == 0, do: n * 10)
1650
编辑:整数可以通过加法来实现
Collectable
,但我不建议这样做,因为(1)这个实现是全局的,(2)没有明显的方法可以“收集”成整数,你也可以使用乘法而不是加法。不过,为了便于学习,下面是如何为具有加法行为的整数实现
可收集的

defimpl Collectable, for: Integer do
  def into(acc) do
    {acc, fn
      acc, {:cont, x} -> acc + x
      acc, _ -> acc
    end}
  end
end

IO.inspect for n <- 1..30, rem(n, 3) == 0, into: 0, do: n * 10

正如Dogbert所写,整数不实现可收集的协议。 当您有一项任务:“将列表转换为数字”时,请考虑
Enum.reduce

a = for n <- 1..30, rem(n, 3) == 0, do: n * 10
Enum.reduce a, 0, &Kernel.+/2
> 1650
a=用于n 1650

因为Dogbert编写的整数不实现可收集协议。
当您有一项任务:“将列表转换为数字”时,请考虑
Enum.reduce

a = for n <- 1..30, rem(n, 3) == 0, do: n * 10
Enum.reduce a, 0, &Kernel.+/2
> 1650
a=用于n 1650

好的,谢谢。让整数支持可收集是可能的吗?
?是的,但有不止一种实现是有意义的——它可以是一个和、一个乘积或一个平均值——只是开始而已。@Dogbert,太棒了!我可以使用其他关键字代替
:进入
?例如,n的
:sum
@李岡諭 您不能像那样扩展内置的
。您可以编写自己的宏并调用它。好的,谢谢。让整数支持可收集是可能的吗?
?是的,但有不止一种实现是有意义的——它可以是一个和、一个乘积或一个平均值——只是开始而已。@Dogbert,太棒了!我可以使用其他关键字代替
:进入
?例如,n的
:sum
@李岡諭 您不能像那样扩展内置的
。您可以编写自己的宏并调用它。听起来您需要将整数列表缩减为一个整数……考虑:
1..30 |>Enum.filter(fn->rem(n,3)=0 end)|>Enum.reduce(0,fn n,acc->acc+n*10 end)
听起来您需要,将整数列表缩减为一个整数…考虑:
1..30 |>Enum.filter(fn->rem(n,3)=0 end)|>Enum.reduce(0,fn n,acc->acc+n*10 end)