有条件采取元素从Stream

我已经实现了以下功能:有条件采取元素从Stream

def gaussian(center, height, width) do 

Stream.iterate(1, &(&1 + 1))

|> Stream.map(fn (x) -> x - center end)

|> Stream.map(fn (x) -> :math.pow(x, 2) end)

|> Stream.map(fn (x) -> -x/(2 * :math.pow(width, 2)) end)

|> Stream.map(fn (x) -> height * :math.exp(x) end)

|> Stream.map(&Kernel.round/1)

|> Stream.take_while(&(&1 > 0))

|> Enum.to_list

end

在给定的指定参数时,则返回一个空列表:

iex> gaussian(10, 10, 3) 

[]

卸下Stream.take_while/2

def gaussian(center, height, width) do 

Stream.iterate(1, &(&1 + 1))

|> Stream.map(fn (x) -> x - center end)

|> Stream.map(fn (x) -> :math.pow(x, 2) end)

|> Stream.map(fn (x) -> -x/(2 * :math.pow(width, 2)) end)

|> Stream.map(fn (x) -> height * :math.exp(x) end)

|> Stream.map(&Kernel.round/1)

#|> Stream.take_while(&(&1 > 0))

#|> Enum.to_list

|> Enum.take(20)

end

给出了这样的但是:

iex> gaussian(10, 10, 3) 

[0, 0, 1, 1, 2, 4, 6, 8, 9, 10, 9, 8, 6, 4, 2, 1, 1, 0, 0, 0]

我的Stream.take_while/2调用有什么问题,或者我在这里完全错过了什么吗?

回答:

Stream.take_while/2停止在该函数评估对false的第一次出现的评价。

在你的情况下,你在功能:

|> Stream.take_while(&(&1 > 0)) 

与指定的参数等

gaussian(10, 10, 3) 

在第一次迭代中接收0因而它不进一步迭代作为表达&1 > 0的计算结果为false

您可以检查自己,如果你的代码扩展到类似:

|> Stream.take_while(fn (x) -> IO.inspect(x); x > 0 end) 

也许它Stream.filter/2你想使用?

希望帮助您解决您的问题!

以上是 有条件采取元素从Stream 的全部内容, 来源链接: utcz.com/qa/258238.html

回到顶部