gpt4 book ai didi

javascript - FP : Reflecting state in absence of actual state change?

转载 作者:行者123 更新时间:2023-11-29 14:57:09 24 4
gpt4 key购买 nike

我不熟悉一些高级函数式编程思想,尤其是:如何处理不可变数据。数据结构通常是复合的,由更小的数据结构组成。例如,如果我们有一个家庭集合,它由一个家庭的所有成员组成。我们可能会构建家庭:

var flintstones = new Family().
add(new Member({name: 'Fred'})). //returns new instance of family
add(new Member({name: 'Wilma'}). // "
add(new Member({name: 'Pebbles'})); // "
var fred = flintstones.get({name: 'Fred'}).set({lname: 'Flintstone'});
flintstones = fred.family(); //new instance of family with latest fred.

注意改变 fred 实际上并没有改变 flintstones。我可以获取对 flintstones 的新引用,但目的是什么?由于所有对象都只是快照,所以我看不出保留引用的意义。状态更改已被抽象掉,因此我们不打算使用观察者模式。因此,如何处理关心状态变化的 GUI 等相关事物?保持事物同步的观察的替代功能是什么?我不认为对象本身与渲染它们有任何关系。功能程序如何处理保持单页 webapp GUI 的状态同步?

物有所值Rich Hickey's talks启发我去探索函数式编程。我理解他的概念,但我很难跳到实际的实现(在 JavaScript 中)。

最佳答案

在您的示例中,Family 应该是不可变的。因此,每次调用 add 都必须返回一个全新的对象,该对象基于现有对象的内容(它们本身是不可变的,因此复制它们不是问题)加上新事物。同样,您在 Fred 上调用的 set 必须返回一个基于 Fred 但具有不同姓氏的全新家庭成员。 (因此 Flintstones 中的原始 Fred 根本没有改变。)

这种函数式风格的优势在于,一旦您获得了对某个对象的引用,您就知道它不会改变。如果它在构造时是有效的,你就不必一直检查它是否仍然有效。您可以将对象从您的代码中传递出去,而无需先克隆它以保护您的内部副本不被更改。

如果您想了解有关函数式编程的更多信息,您最好尝试使用纯函数式语言,例如 Haskell 或 F#;尝试使用 JavaScript 进行函数式编程很可能会造成混淆。

关于javascript - FP : Reflecting state in absence of actual state change?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15979597/

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