【发布时间】:2016-03-14 01:17:50
【问题描述】:
我是函数式/不可变编程的新手,但我碰壁了。我正在尝试在Elixir 中实现一个非常简单的重复数据删除功能,以对stdin 进行重复数据删除。
我有一个使用 Stream.transform/2 的非常简单的实现,但我的原始实现使用了这样的 Stream.filter/2(为了举例目的,这被简化了),我不确定我是否理解它为什么不起作用:
hashes = HashSet.new
IO.stream(:stdio, :line)
|> Stream.filter(fn(line) ->
if HashSet.member?(hashes, line) do
false
else
hashes = HashSet.put(hashes, line)
true
end
end)
|> Enum.each(&IO.write(&1))
这个想法显然是有一个 Set 包含读入的行,并且在每个循环中都会更新。
现在,一些调试使我发现filter 回调中的hashes 在每个循环中都是空的,所以我猜它没有更改外部变量?我相信我只想重新绑定外部的变量,而不是过滤器函数内部的变量。这可能吗?
我认为我遇到了这个 JavaScript 所证明的范围界定问题(这是我能想到的唯一比较):
var hashes = new Set();
arr.filter(function (element) {
var hashes = something(element); // i.e. using var not using outer scope
});
任何人都可以确切地澄清上述实现的不正确之处吗?在此先感谢:)
【问题讨论】:
标签: functional-programming elixir