我正在使用Bluebird做异步操作,但现在必须做很多空/空/错误检查,我不想按照通常的Else路线.我正在考虑使用monad,但尚未彻底完成它.
此外,我希望它能与ramda一起使用,pipe / compose因为我的大多数其他代码都整齐地封装在功能管道中.根据许多 讨论,monadic Futures(Fluture似乎被推荐)比Promises更受欢迎,对pipeP的支持和composeP可能在未来版本中被删除.
Fluture似乎是一个不错的选择,因为据说它可以很好地适应那些坚持幻想 - 土地规格的图书馆(如ramda).
但是我完全迷失了如何实现将Ramda的管道与Fluture集成在一起的东西.我需要一些示例代码的帮助.
例如:
我有一个DB调用,返回一个对象数组.数组可能具有值,为空或未定义.我有一个功能管道,可以转换数据并将其返回到前端.
示例承诺代码:
fancyDBCall1(constraints)
.then(data => {
if (!data || data.length === 0) {
return []
}
return pipe(
...
transformation functions
...
)(data)
})
.then(res.ok)
.catch(res.serverError)
Run Code Online (Sandbox Code Playgroud)
有人可以就一个好的方法提出一些指示.
试图弄清楚IO monad是如何工作的.
使用下面的代码,我阅读filenames.txt并使用结果重命名目录中的文件testfiles.这显然是未完成的,所以不是实际重命名我记录到控制台的任何东西.:)
我的问题是:
runIO两次电话,但感觉它应该只调用一次,最后呢?renameIO而renaneDirect不是找不到合适的语法.任何其他建议也很感激,我是FP的新手!
var R = require('ramda');
var IO = require('ramda-fantasy').IO
var fs = require('fs');
const safeReadDirSync = dir => IO(() => fs.readdirSync(dir));
const safeReadFileSync = file => IO(() => fs.readFileSync(file, 'utf-8'));
const renameIO = (file, name) => IO(() => console.log('Renaming file ' + file + ' to ' + name + '\n'));
const renameDirect = (file, name) => console.log('Renaming file ' + file + ' …Run Code Online (Sandbox Code Playgroud) 最近我决定从 lodash 切换到 ramda,以使用功能方式来编写我的逻辑。我喜欢它!在对 FP 进行了一些广泛的挖掘之后,我发现它不仅与方便的纯/无点实用程序 (ramda) 有关,而且更多地与复杂的(至少对我而言)数学抽象(fantasy-land)有关。我没有全部了解,但Either 和Task 模式看起来非常方便。问题是我不确定如何将它与 ramda 实用程序合并。我知道 ramda-fantasy,但它不再维护。Ramda-fantasy 建议的库与 ramda-fantasy 的工作方式不同。有了关于 Monads/Monoids/Functors 类型的所有这些新信息,我完全迷失了。
例如,这个约定是什么?
Right('boo')
.map(x => x + '!')
.map(x => x.toUpperCase())
vs
R.pipe(
R.map(x => x + '!')
R.map(x => x.toUpperCase())
)(Right('boo'))
Run Code Online (Sandbox Code Playgroud)
如果我决定一直切换到 Monads,我是否不需要 ramda?
javascript functional-programming ramda.js fantasyland ramda-fantasy
假设我有一堆函数返回Just或Nothing值,我想将它们链接在一起;
var a = M.Just("5").map(function(data){
return 1;
}).chain(function(data){
/*Make some operation return Just or Nothing */
console.log(data);
return M.Just(2);
}).chain(function(data){
/*Make some operation return Just or Nothing */
console.log(data);
return M.Nothing("Reason 1");
}).chain(function(data){
/*Make some operation return Just or Nothing */
console.log(data);
return M.Nothing("Reason 2");
}).getOrElse(function(data){
console.log(data);
return "Message";
});
console.log(a());
Run Code Online (Sandbox Code Playgroud)
输出:
> 1
> 2
> undefined
> Message
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,因为它在函数返回M.Nothing("Reason 1")的步骤失败,所以它没有通过我预期的其他函数.我相信Nothing没有有效的构造函数来获取参数.有没有办法在执行结束时获取此失败消息?我在民间故事中也试过这个,它与梦幻土地规格有关吗?
谢谢
javascript functional-programming ramda.js fantasyland ramda-fantasy