Programming languages 有没有任何编程语言的变量是真正的函数?
例如,我会写:Programming languages 有没有任何编程语言的变量是真正的函数?,programming-languages,variables,function,dataflow,Programming Languages,Variables,Function,Dataflow,例如,我会写: x = 2 y = x + 4 print(y) x = 5 print(y) 它将输出: 6 (=2+4) 9 (=5+4) 还有,在什么情况下,这真的有用吗 澄清:是的,lambdas等解决了这个问题(他们是我如何得出这个想法的);我想知道是否有一些特定的语言是默认的:不需要函数或lambda关键字。查看各种函数语言,如F#、Haskell和Scala。Scala将函数视为具有apply()方法的对象,您可以将它们存储在变量中,并像传递任何其他类型的对象一样传递它们。我不
x = 2
y = x + 4
print(y)
x = 5
print(y)
它将输出:
6 (=2+4)
9 (=5+4)
还有,在什么情况下,这真的有用吗
澄清:是的,lambdas等解决了这个问题(他们是我如何得出这个想法的);我想知道是否有一些特定的语言是默认的:不需要函数或lambda关键字。查看各种函数语言,如F#、Haskell和Scala。Scala将函数视为具有apply()方法的对象,您可以将它们存储在变量中,并像传递任何其他类型的对象一样传递它们。我不知道您是否可以将Scala函数的定义作为代码打印出来 更新:我似乎记得,至少有一些Lisp允许您将函数作为代码漂亮地打印出来(例如Scheme的漂亮打印函数) 试着看看F#和关于函数式编程语言的文章 自从我专注于OOP以来,我自己还没有研究过这些类型的语言,但一旦F#问世,我将很快深入研究
希望这有帮助 我所见过的最接近的一种是技术分析系统在绘制组件图方面的一部分。(Tradestation、metastock等),但它们主要关注返回多组元数据(如买入/卖出信号),然后这些元数据可以输入到接受元数据或财务数据的其他函数中,或者直接打印 我的2c: 我想说,至少可以说,你所说的一种语言会让人非常困惑。出于充分的理由,函数通常为r值。这段代码(javascript)显示了如何将函数强制为r值,从而将可读性(以及维护)提高n倍:
可以在C中使用func表达式#
Func y=(x)=>x+5;
控制台写入线(y(5));//10
Console.WriteLine(y(3));//8.
。。。或者
int x = 0;
Func<int> y = () => x + 5;
x = 5;
Console.WriteLine(y()); // 10
x = 3;
Console.WriteLine(y()); // 8
intx=0;
Func y=()=>x+5;
x=5;
Console.WriteLine(y());//10
x=3;
Console.WriteLine(y());//8.
。。。如果您真的想要以功能性风格编程,那么第一个选项可能是最好的
Haskell会让你半途而废,因为本质上一切都是一个函数,但变量只绑定一次(这意味着不能在同一范围内重新分配
x
)
<> >很容易考虑<代码> y= x+4 一个变量赋值,但是当你查看<代码> y= map(+ 4)[1…] /代码>时(这意味着从无穷大列表中的每个数加上4个,从1个向上),什么是<代码> y< /代码>?它是一个无限列表,还是一个返回无限列表的函数?(提示:这是第二个。)在这种情况下,如果不是绝对必要的话,将变量作为函数来处理是非常有益的
实际上,在Haskell中,y
的定义是一个不接受参数并返回x+4
的函数,其中x
也是一个不接受参数但返回值2的函数
在任何具有一阶函数的语言中,将匿名函数指定给变量都很简单,但是对于大多数语言,您必须添加括号来指示函数调用 Lua代码示例:
x = function() return 2 end
y = function() return x() + 4 end
print(y())
x = function() return 5 end
print(y())
$python x.py
6.
9
这就是电子表格的工作方式
它还与计算函数参数的语义有关。Algol 60有这个功能,但它没有流行起来,太复杂了,无法实现。对字段和方法没有区别,两者都是插槽,可以完全相同的方式访问。插槽可以包含一个值或一个函数(因此这两个仍然是独立的实体),但区别对插槽的用户并不重要。在Scala中,函数中有惰性值和按名称调用的参数
def foo(x : => Int) {
println(x)
println(x) // x is evaluated again!
}
在某种程度上,这可能会产生您所期望的效果。我相信面向数学的语言喜欢,并且会这样做。我可能错了,但是没有人提到过,所以我想我会的。编程语言可以做到这一点,尽管它调用的是
x
和y
“流”而不是函数。
该程序将编写为:
y
where
y = x + 4
end
然后输入:
x(0): 2
y = 6
x(1): 5
y = 7
当然,Lucid(像大多数有趣的编程语言一样)是相当模糊的,所以我并不奇怪没有人发现它。(或寻找它)F#据我所知已经发布,直到2010年才成为Visual Studio的正式部分。2008年的版本仍然是“CTP”。Algol68(1968)是强类型的,允许声明函数变量,例如:MODE FUN=PROC INT;乐趣x:=INT:2;乐趣y:=INT:x+4;印刷品(y);x:=INT:5;打印(y)。。。生产:+6+9。。。c、 f.Sourceforge:[]仅供参考,您还对currying函数的概念感到兴趣。您可能会发现快速阅读很有趣:
x = lambda: 2
y = lambda: x() + 4
print(y())
x = lambda: 5
print(y())
$ python x.py
6
9
def foo(x : => Int) {
println(x)
println(x) // x is evaluated again!
}
y
where
y = x + 4
end
x(0): 2
y = 6
x(1): 5
y = 7