zoukankan      html  css  js  c++  java
  • 函数式编程(二):curry

    其他:

    函数式编程(一):纯函数

    函数式编程(三):组合函数

    curry的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

    var add = function(x) {
    	return function(y) {
    		return x + y;
    	};
    };
    var increment = add(1);
    var addTen = add(10);
    increment(2);
    //	3
    addTen(2);
    //	12

    这是一个非常简单的 curry 函数。在调用 add 之后,返回的函数就通过闭包的方式记住了 add 的第一参数。(关于闭包可参见:闭包(一)闭包(二)

    很多类库提供了可以让我们快速编写 curry 函数的工具(比如 lodash,ramda)。

    var curry = require('lodash').curry;
    var match = curry(function(what, str) {
    	return str.match(what);
    });
    var replace = curry(function(what, replacement, str) {
    	return str.replace(what, replacement);
    });
    var filter = curry(function(f, ary) {
    	return ary.filter(f);
    });
    var map = curry(function(f, ary) {
    	return ary.map(f);
    });
    
    使用
    match(/s+/g,	"hello	world");
    //	[	'	'	]
    match(/s+/g)("hello	world");
    //	[	'	'	]
    var	hasSpaces	=	match(/s+/g);
    //	function(x)	{	return	x.match(/s+/g)	}
    hasSpaces("hello	world");
    //	[	'	'	]
    hasSpaces("spaceless");
    //	null
    filter(hasSpaces,	["tori_spelling",	"tori	amos"]);
    //	["tori	amos"]
    var	findSpaces	=	filter(hasSpaces);
    //	function(xs)	{	return	xs.filter(function(x)	{	return	x.match(/s+/g)	})	}
    findSpaces(["tori_spelling",	"tori	amos"]);
    //	["tori	amos"]
    var	noVowels	=	replace(/[aeiou]/ig);
    //	function(replacement,	x)	{	return	x.replace(/[aeiou]/ig,	replacement)	}
    var	censored	=	noVowels("*");
    //	function(x)	{	return	x.replace(/[aeiou]/ig,	"*")	}
    censored("Chocolate	Rain");
    //	'Ch*c*l*t*	R**n'

    当我们讨论纯函数的时候,我们说它们接受一个输入返回一个输出。curry 函数所做的正是这样:每传递一个参数调用函数,就返回一个新函数处理剩余的参数。这就是一个输入对应一个输出。(哪怕输出是另一个函数,它也是纯函数)。当然 curry 函数也允许一次传递多个参数。

    使用 curry 函数,我们就可以通过简单地传递几个参数,就能动态创建实用的新函数。而且还能带来一个而额外的好处,那就是保留了数学的函数定义。

    ##一道面试题

    function add(x) {
        // 填空
    }
    // 使得输出9
    alert(add(2)(3)(4));

    这道题目实际上就是考 curry 还有 toString。。

    答案:

    function add(x) {
        // sum保存于闭包中
        var sum = x;
        var tmp = function(y) {
            sum += y;
            return tmp;
        };
        // 重写tmp函数的toString和valueOf方法,才能使alert出数字
        tmp.toString = tmp.valueOf = function() {
            return sum;
        };
        return tmp;
    }
    
    alert(add(2)(3)(4)); //9
  • 相关阅读:
    Windows 10 开发日记(二)-- 手势顺序调研
    Windows 10 开发日记(一) -- 手势通览
    开篇说两句
    我从上海回苏州了,你懂的!
    数组名相关
    指针相关笔记
    static相关
    输入分式,输出化简式的C语言算法
    语句界定
    switch相关
  • 原文地址:https://www.cnblogs.com/hwencc/p/5058510.html
Copyright © 2011-2022 走看看