gpt4 book ai didi

functional-programming - 在 Elixir 的外部范围内重新绑定(bind)变量

转载 作者:行者123 更新时间:2023-12-01 09:20:23 26 4
gpt4 key购买 nike

我是函数式/不可变编程的新手,但我碰壁了。我正在尝试在 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 在每个循环中都是空的,所以我猜它没有更改外部变量?我相信我只想重新绑定(bind)外部的变量,而不是过滤器函数内部的变量。这可能吗?

我认为我遇到了这个 JavaScript 所证明的范围界定问题(这是我能想到的唯一比较):

var hashes = new Set();

arr.filter(function (element) {
var hashes = something(element); // i.e. using var not using outer scope
});

任何人都可以确切地澄清上述实现的不正确之处吗?在此先感谢:)

最佳答案

来自 https://elixir-lang.readthedocs.org/en/latest/technical/scoping.html#function-clause-scope :

Each function clause defines a new lexical scope: any new variable bound inside it will not be available outside of that clause

由于 Elixir 中的不变性和变量是如何实现的,因此在内部函数中分配给 hashes 与每次都绑定(bind)到一个新变量是一样的。

关于functional-programming - 在 Elixir 的外部范围内重新绑定(bind)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34167424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com