所以,我只是在想,链接是多么的酷,它如何使事情更容易阅读。对于很多语言,当将一组函数应用于变量时,您会编写如下所示的内容:
i(h(g(f(x))))你必须从右到左或从内到外读。首先应用f,然后应用g,以此类推。但是如果是链子的话,它看起来会更像
x|f|g|h|i你可以像个正常人一样读它。所以,我的问题是,必须有一些语言这样做,他们是什么?这些花哨的函数式编程语言就是这么做的吗?
因此,我通常会创建一大堆临时变量,以便将其拆分到不同的行中,并使其更具可读性:
a = f(x)
b = g(a)
c = h(b)
what_i_really_wanted_all_along = i(c)在我的神奇语言中,如果它们太长,您仍然可以将其拆分成不同的行,而不需要插入变量:
x | f
| g
| h
| i发布于 2010-11-26 02:13:13
是的,对于F#,您有一个管道操作符|> (也称为正向管道操作符,还有一个反向管道<|)。
你把它写成:x |> f |> g |> h |> i
请检查这个博客帖子,它给出了一个很好的实际使用方法。
发布于 2010-11-26 02:11:36
它并不仅限于函数式编程,尽管它可能最好用函数式语言实现,因为功能组合的整个概念完全在函数式程式设计的范畴内。
首先,任何具有面向对象特性的语言都会链接返回类实例的方法:
obj.method1().method2().method3(); // JavaScript
MyClass->new()->f()->g()->i(); # Perl或者,这种链接模式中最著名但最少的“编程语言”示例将是完全非面向对象和非功能的.你猜到了,Unix里的管道。就像,ls | cut -c1-4 | sort -n。由于shell编程被认为是一种语言,我认为它是一个非常有效的例子。
发布于 2010-11-26 03:35:39
那么,您可以在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里。
https://stackoverflow.com/questions/4282083
复制相似问题