试图理解仿函数但不明白该代码到底在做什么

时间:2018-01-22 23:22:26

标签: javascript functional-programming

下面的代码将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第一课(很遗憾我只是停留在第一课)

1 个答案:

答案 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)"