首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >把链子拴到极致的语言?

把链子拴到极致的语言?
EN

Stack Overflow用户
提问于 2010-11-26 02:05:44
回答 7查看 440关注 0票数 1

所以,我只是在想,链接是多么的酷,它如何使事情更容易阅读。对于很多语言,当将一组函数应用于变量时,您会编写如下所示的内容:

代码语言:javascript
复制
i(h(g(f(x))))

你必须从右到左或从内到外读。首先应用f,然后应用g,以此类推。但是如果是链子的话,它看起来会更像

代码语言:javascript
复制
x|f|g|h|i

你可以像个正常人一样读它。所以,我的问题是,必须有一些语言这样做,他们是什么?这些花哨的函数式编程语言就是这么做的吗?

因此,我通常会创建一大堆临时变量,以便将其拆分到不同的行中,并使其更具可读性:

代码语言:javascript
复制
a = f(x)
b = g(a)
c = h(b)
what_i_really_wanted_all_along = i(c)

在我的神奇语言中,如果它们太长,您仍然可以将其拆分成不同的行,而不需要插入变量:

代码语言:javascript
复制
x | f
  | g
  | h
  | i
EN

回答 7

Stack Overflow用户

发布于 2010-11-26 02:13:13

是的,对于F#,您有一个管道操作符|> (也称为正向管道操作符,还有一个反向管道<|)。

你把它写成:x |> f |> g |> h |> i

请检查这个博客帖子,它给出了一个很好的实际使用方法。

票数 5
EN

Stack Overflow用户

发布于 2010-11-26 02:11:36

它并不仅限于函数式编程,尽管它可能最好用函数式语言实现,因为功能组合的整个概念完全在函数式程式设计的范畴内。

首先,任何具有面向对象特性的语言都会链接返回类实例的方法:

代码语言:javascript
复制
obj.method1().method2().method3(); // JavaScript
MyClass->new()->f()->g()->i(); # Perl

或者,这种链接模式中最著名但最少的“编程语言”示例将是完全非面向对象和非功能的.你猜到了,Unix里的管道。就像,ls | cut -c1-4 | sort -n。由于shell编程被认为是一种语言,我认为它是一个非常有效的例子。

票数 3
EN

Stack Overflow用户

发布于 2010-11-26 03:35:39

那么,您可以在JavaScript及其亲属中这样做:

代码语言:javascript
复制
function compose()
{
    var funcs = Array.prototype.slice.call(arguments);
    return function(x)
    {
        var i = 0, len = funcs.length;
        while(i < len)
        {
            x = funcs[i].call(null, x);
            ++i;
        }
        return x;
    }
}

function doubleIt(x) { print('Doubling...'); return x * 2; }

function addTwo(x) { print('Adding 2...'); return x + 2; }

function tripleIt(x) { print('Tripling...'); return x * 3; }

var theAnswer = compose(doubleIt, addTwo, tripleIt)( 6 );
print( 'The answer is: ' + theAnswer );
// Prints:
//   Doubling...
//   Adding 2...
//   Tripling...
//   The answer is: 42

正如您所看到的,函数从左到右读取,对象和函数都不需要任何特殊的实现。秘密都在compose里。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4282083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档