设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

为什么我们要学习Haskell这样的编程语言

2012-4-11 09:46| 发布者: 红黑魂| 查看: 10275| 评论: 1|来自: 外刊IT评论

摘要: 最近的几个月,我一直在学习一种叫Haskell的编程语言。由于里面有太多的从未遇到的编程概念,整个过程就像是完全重新学习如何编程。在i.TV网站上,我写了很多JavaScript(node.js和前端代码)。虽然有不少的函数式/has ...

偏函数用法(Partial Application)

偏函数用法(Partial Function Application)是指创建一个调用另外一个部分参数已经预置的函数的函数的用法。这样,它就能被别的地方,比如count函数,以更少的参数形式来调用。我们在makeEq函数里已经实现了这些,但是,我们并不想针对我们各种功能开发出各种版本的makeX(比如makeEqt,makeGt,makeLt等)函数。让我们来找一种方法能通用于各种形式的函数。

function applyFirst(f, a) {
    return function(b) {
        return f.call(null, a, b)
    }
}

count([1,3,3,4,5], applyFirst(eq, 3))

现在我们不再需要一个makeEq函数了。任何2个参数的库函数,我们都可以按这种方式调用。通过偏函数用法,使得定义即使是诸如==这样简单功能的各种函数都变得十分有意义,我们可以在高阶函数中更容易的使用它们。

对那些超过2个参数的函数如何办呢?下面的这一版本3能让我们接受任意多的参数,高阶函数可以自己追加参数。

function apply(f) {
    var args = Array.prototype.slice.call(arguments, 1)
    return function(x) {
        return f.apply(null, args.concat(x))
    }
}

function propertyEquals(propertyName, value, obj) {
    return (obj[propertyName] == value)
}

count([{name:"bob"},{name:"john"}], apply(propertyEquals, "name", "bob")) // == 1

我们预置了2个参数,“name” 和 “bob”,count函数补足了最后一个参数来完成整个调用。偏函数用法使我们能接受各样的函数为参数,例如eq,然后把它们用于各样的高阶函数,例如count,以此来解决我们特定的问题。

配合ES5的 Map 和 Filter 功能函数的偏函数用法

ES5里有很多非常好的高阶函数,underscore里的数量更多。让我们看看filter函数——一个接收比较函数、过滤数组内容的函数。

// this equals [1,3,3]
[1,3,3,4,5].filter(function(num) {
    return (num < 4)
})

让我们把它替换成一个可以复用的比较函数lt (less than)。

function lt(a, b) {
    return (a < b)
}

[1,3,3,4,5].filter(apply(lt, 4))

看上去添加这个lt函数的做法有点傻,但是,我们可以使用偏函数用法来创造一个很简练的比较函数,当这个比较函数变的很复杂的时候,我们就能从对它的复用过程中获得好处。


酷毙
2

雷人

鲜花
1

鸡蛋

漂亮

刚表态过的朋友 (3 人)

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部