gpt4 book ai didi

javascript - 通过在函数中包装参数来延迟评估?

转载 作者:行者123 更新时间:2023-12-01 13:11:45 26 4
gpt4 key购买 nike

在函数式编程的最适当指南中 Chapter 8 ,他们定义了一个新类,IO,定义如下:

class IO {
static of(x) {
return new IO(() => x);
}

constructor(fn) {
this.$value = fn;
}

map(fn) {
return new IO(compose(fn, this.$value));
}

inspect() {
return `IO(${inspect(this.$value)})`;
}
}

作者解释:

IO delays the impure action by capturing it in a function wrapper. As such, we think of IO as containing the return value of the wrapped action and not the wrapper itself. This is apparent in the of function: we have an IO(x), the IO(() => x) is just necessary to avoid evaluation.

但我对 .of() 方法如何延迟评估感到困惑。例如,从本节开头开始定义,

// getFromStorage :: String -> (_ -> String)
const getFromStorage = key => () => localStorage[key];

例如,如果我尝试创建一个新的 IO 对象,例如 IO.of(localStorage[42]),这根本不会延迟评估。 localStorage[42] 的值会立即求值(假设它求值为 "foo"),然后会创建新的 IO 对象使用 { $value: () => "foo"}

我明白如何像 new IO(key => () => localStorage[key]) 那样直接调用构造函数会延迟评估,但我不明白是什么作者的意思是使用 .of() 方法以及如何“避免评估”。此外,作者在IO的任何示例中都没有使用.of(),而是直接调用构造函数。

最佳答案

为了使 IO 成为单子(monad)的(根据那本书的单子(monad)概念),它需要一个 .of 方法,该方法可以将任意值包装在 IOIO.of 就是这样做的。由于本书对 IO 的实现的本质是它们携带一个可以在稍后计算的函数,因此 .of 方法将传递的值包装在一个函数中.

IO.of(5) 创建一个 IO 的实例,它包装了值 5。就这些。 .of 并没有真正延迟效果。

关于评论中的问题:

Then what does the author mean by saying "This is apparent in the of function: we have an IO(x), the IO(() => x) is just necessary to avoid evaluation."

我认为理解该评论所必需的信息是它之前的内容:

We don't think of its $value as a function, however - that is an implementation detail and we best ignore it. ... As such, we think of IO as containing the return value of the wrapped action and not the wrapper itself.

他的观点似乎是,从概念上讲,IO 的“值”是包含的函数最终求值的值,但为了实现延迟求值,它在内部存储了一个未求值的值函数直到 IO 有必要解析为一个值。

因此您可以通过调用 IO.of(5) 为值 5 创建一个 IO,但在内部,它包含一个函数计算结果为 5,以便稍后可以将此函数计算为一个值。

如果你想创建一个 IO 实际上会延迟对某些不纯效果的评估,请使用构造函数并向其传递一个函数。

关于javascript - 通过在函数中包装参数来延迟评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59541760/

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