我在尝试将以下 Haskell 代码转换为 Javascript 时完全迷失了:
instance MonadFix IO where
mfix f = do
var <- newEmptyMVar -- 1
ans <- unsafeInterleaveIO $ takeMVar var -- 2
result <- f ans -- 3
putMVar var result -- 4
return result -- 5
让我们根据我们的小时间旅行类比逐行遍历:
- 创建一个空的可变变量。
- 预测将包含在该可变变量中的未来值。
- 使用预测的未来值调用函数 f。
- 将 f 的结果存储在变量中,从而实现第 2 行所要求的预言。
- 返回那个结果。
我拥有的是一种特殊Lazy
类型,可以处理(或更确切地说是推迟)同步IO
。但是,我想用值递归从直接递归中抽象出来:
const record = (type, o) =>
(o[Symbol.toStringTag] = type.name || type, o);
const Lazy = lazy => record(Lazy, {get lazy() {
delete this.lazy
return this.lazy = lazy();
}});
// Monad
const lazyChain = mx => fm =>
Lazy(() => fm(mx.lazy).lazy);
const lazyChain_ = fm => mx =>
Lazy(() => fm(mx.lazy).lazy);
const lazyOf = x => Lazy(() => x);
// mfix = chain_ => fm => chain_(fm) (mfix(chain_) (fm)) ???
// MAIN
const trace = x => (console.log(x), x);
const app_ = x => f => trace(f(x));
const readLine = s => Lazy(() => window.prompt(s));
const fac = x => x === 0 ? 1 : x * fac(x - 1),
tri = x => x === 0 ? 0 : x + tri(x - 1);
const foo = lazyChain(readLine("enter true/false")) (s => {
return lazyOf(s === "true"
? fac : tri);
});
const bar = x => lazyChain(foo) (y => lazyOf(app_(x) (y)));
const main = bar(5);
console.log("effect has not yet been unleashed..");
main.lazy;
如何在 Javascript 中实现Lazy
实例?MonadFix