Javascript 回复:ramda fantasy map方法中遇到错误

Javascript 回复:ramda fantasy map方法中遇到错误,javascript,functional-programming,ramda-fantasy,Javascript,Functional Programming,Ramda Fantasy,我正在试图了解地图在FP中是如何工作的。我想测试map在函数式编程中是如何工作的 下面是测试代码 var R = require('ramda'); var M = require('ramda-fantasy').Maybe; var Just = M.Just; var Nothing = M.Nothing; var safeDiv = R.curry(function (n, d) { return d === 0 ? Nothing() : Just(n / d); }); var l

我正在试图了解地图在FP中是如何工作的。我想测试map在函数式编程中是如何工作的

下面是测试代码

var R = require('ramda');
var M = require('ramda-fantasy').Maybe;
var Just = M.Just;
var Nothing = M.Nothing;
var safeDiv = R.curry(function (n, d) { return d === 0 ? Nothing() : Just(n / d); });
var lookup = R.curry(function (k, obj) { return k in obj ? Just(obj[k]) : Nothing(); });
var a2 = M.maybe(100, R.inc);
var a4 = M.of(10);
console.log(a2); //output [Function]
console.log(a4); //output Just{ value: 10}
console.log(a2(Nothing())); //output 100
console.log(a2(M.of(20))); //out 21
// This is why I can't understand
// I think it is the same M.of(20).map(a2) === a2(M.of(20)).
console.log(M.of(20).map(a2));
// Produce the followng error message
// /mnt/e/work/fpjs/node_modules/ramda-fantasy/src/Maybe.js:49
// return m.reduce(function(_, x) {
//     TypeError: m.reduce is not a function
//     at /mnt/e/work/fpjs/node_modules/ramda-fantasy/src/Maybe.js:49:12
//     at /mnt/e/work/fpjs/node_modules/ramda/src/internal/_curryN.js:37:27
//     at /mnt/e/work/fpjs/node_modules/ramda/src/internal/_arity.js:5:45
//     at Just.map (/mnt/e/work/fpjs/node_modules/ramda-fantasy/src/Maybe.js:56:18)
//     at Object.<anonymous> (/mnt/e/work/fpjs/data/test3.js:14:22)
//     at Module._compile (module.js:571:32)
//     at Object.Module._extensions..js (module.js:580:10)
//     at Module.load (module.js:488:32)
//     at tryModuleLoad (module.js:447:12)
//     at Function.Module._load (module.js:439:3) 
var R=require('ramda');
var M=需求('ramda-fantasy')。可能;
var Just=M.Just;
var Nothing=M.Nothing;
var safeDiv=R.curry(函数(n,d){return d==0?Nothing():Just(n/d);});
var lookup=R.curry(函数(k,obj){返回obj中的k?Just(obj[k]):Nothing();});
var a2=M.maybe(100,R.inc);
var a4=M.of(10);
控制台日志(a2)//输出[功能]
控制台日志(a4)//仅输出{值:10}
log(a2(Nothing())//输出100
控制台日志(a2(M.of(20))//出局21
//这就是我不明白的原因
//我认为这是相同的M.of(20)。map(a2)==a2(M.of(20))。
控制台日志(M.of(20).map(a2));
//生成以下错误消息
///mnt/e/work/fpjs/node_modules/ramda fantasy/src/Maybe.js:49
//返回m.reduce(函数(x,x){
//TypeError:m.reduce不是一个函数
//at/mnt/e/work/fpjs/node_modules/ramda fantasy/src/Maybe.js:49:12
//at/mnt/e/work/fpjs/node_modules/ramda/src/internal/_curryN.js:37:27
//at/mnt/e/work/fpjs/node_modules/ramda/src/internal/_arity.js:5:45
//在Just.map(/mnt/e/work/fpjs/node_modules/ramda fantasy/src/Maybe.js:56:18)
//at对象。(/mnt/e/work/fpjs/data/test3.js:14:22)
//在模块处编译(模块js:571:32)
//在Object.Module.\u extensions..js(Module.js:580:10)
//在Module.load(Module.js:488:32)
//在tryModuleLoad时(module.js:447:12)
//在Function.Module.\u加载(Module.js:439:3)
我认为这是相同的
M.of(20).map(a2)
=
a2(M.of(20))

不,不是。当你在一个数据结构上调用一个函数时,它将被包含的值调用——在这种情况下,
20
。并且
a2(20)
抛出你得到的错误

例如,您可以做的是
M.of(20).map(R.inc)
-结果将是
仅{value:21}
,而
M.Nothing().map(R.inc)
将产生