下面的代码将map方法添加到函数原型中,这样我们就可以映射我们的函数,它基本上构成了map函数和mappable函数的结果。我明白了
Function.prototype.map = function (f) {
const g = this
return function () {
return f(g.apply(this, arguments))
}
}
但是不明白以下
const Box = x => ({
map: f => Box(f(x)),
fold: f => f(x),
inspect: () => `Box(${x})`
})
const nextCharForNumberString = str =>
Box(str)
.map(s => s.trim())
.map(s => new Number(s))
.map(s => s + 1)
.map(s => String.fromCharCode(s))
.fold(s => s.toLowerCase())
console.log(nextCharForNumberString(' 64 '));
你能帮我理解一下吗? Box是一个函数Box(x),之后我就失去了轨道。为什么那些括号(({}))以及那个东西是如何工作的。
感谢您的时间和理解,
顺便提一下第一个代码 https://medium.com/@dtinth/what-is-a-functor-dcf510b098b6 第二个代码来自egghead.io的功能性javascript第一课(很遗憾我只是停留在第一课)
答案 0 :(得分:2)
从es6语法中扩展代码可能会有所帮助。
function Box(param) {
return {
map: function(fn) { return Box(fn(param)); },
fold: function(fn) { return fn(param) },
inspect: function() { return `Box(${param})`;
}
}
示例:let a = Box(1);
从Box
函数返回对象,并允许您访问a.map, a.fold, or a.inspect
a.map
将函数作为参数。让我们说该函数返回了plus 1
function myFunction(n) { return n + 1 };
您可以致电a.fold(myFunction)
,返回的值等于2
。这是因为我们的初始param
为1,我们的函数将该参数作为其参数并返回。
基本上fold
会将任何函数应用到param
并返回它。
map
类似,只是它会返回Box(myFunction(1))
,它会返回一个Box
的新param + 1
对象,因为我们的函数会改变我们的参数。
inspect
只输出一个字符串,告诉你param的当前值是什么。
概述:
function add1(n) { return n + 1 }
let a = Box(1); //param is 1.
a.fold(add1); //translates to add1(1);
a.map(add1); //translates to Box(add(1)), aka, Box(2)
a.inspect(); //translates to "Box(2)"