【问题标题】:Functional javascript read, async, write result函数式 javascript 读取、异步、写入结果
【发布时间】:2016-09-10 03:28:25
【问题描述】:

我现在正在阅读大部分足够的 fp 指南。但我不知道如何正确组合这些函数。

const R = require('ramda');
const {IO, Future} = require('ramda-fantasy');

const read = () => IO(() => 'hello');
const write = (data) => IO(() => {
    console.log(data)
    return data;
});

const process = (data) => Future((reject, resolve) => {
  return setTimeout(() => resolve(data), 0);
});

结合函数的最佳方式是什么:读 -> 进程 -> 写?

【问题讨论】:

  • 你的process函数真的是异步的吗?
  • 我猜你需要为IO<Promise<A>>(或IO<Future<A>>)编写一个monad转换器,但你需要在JS中手动完成
  • @Bergi 为清楚起见添加了设置超时。
  • 如果您不使用 IO 数据类型,则不需要 monad 转换器。 IO 数据类型在 JavaScript 中毫无意义。事实上,Future 或Promise 数据类型才是真正的IO 数据类型。

标签: javascript functional-programming monads


【解决方案1】:

将 ios 更改为期货。

const R = require('ramda');
const {Future} = require('ramda-fantasy');

const read = () => Future((reject, resolve) => resolve('hello'));

const write = (data) => Future((reject, resolve) => {
    console.log(data)
    resolve(data);
});

const process = (data) => Future((reject, resolve) => {
    return setTimeout(() => resolve(data), 0);
});

read.chain(process)
    .chain(write)
    .fork(console.warn, console.log);

Futures 就像异步 ios,所以在这两种类型之间提升没有太大意义。如果您真的想以不同的方式对待它们,您可以按照 bergi 的建议将 monad 嵌套到 IO> 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 2011-12-27
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多