有变量真正起作用的编程语言吗?

时间:2009-10-07 02:01:59

标签: programming-languages variables function dataflow

例如,我会写:

x = 2
y = x + 4
print(y)
x = 5
print(y)

它会输出:

6 (=2+4)
9 (=5+4)

此外,在任何情况下,这实际上是否有用?

澄清:是的,lambdas等解决了这个问题(他们是我如何得出这个想法);我想知道是否有特定的语言,这是默认:没有函数或lambda关键字需要或需要。

10 个答案:

答案 0 :(得分:7)

Haskell会中途遇见你,因为基本上所有东西都是函数,但变量只绑定一次(意味着你不能在同一范围内重新分配x)。

很容易考虑y = x + 4变量赋值,但是当你看y = map (+4) [1..](这意味着从1向上向无限列表中的每个数字加4)时,y是什么现在?它是无限列表,还是函数返回无限列表? (提示:这是第二个。)在这种情况下,当利用{{3}时,将变量视为函数可能非常有益,如果不是绝对必要的话。 }。

实际上,在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())
$ lua x.lua
6
9

或者Python中的相同内容(坚持使用一阶函数,但我们可以使用x的普通整数):

x = lambda: 2

y = lambda: x() + 4

print(y())

x = lambda: 5

print(y())
$ python x.py
6
9

答案 1 :(得分:4)

你可以在C#中使用func表达式

Func<int, int> y = (x) => x + 5;
Console.WriteLine(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

...如果你真的想要以功能风格编程,第一个选项可能是最好的。

  1. 它看起来更像你在数学课上看到的东西。
  2. 你不必担心外部状态。

答案 2 :(得分:2)

查看各种函数语言,如F#,Haskell和Scala。 Scala将函数视为具有apply()方法的对象,您可以将它们存储在变量中并像传递任何其他类型的对象一样传递它们。我不知道你可以打印出Scala函数的定义作为代码。

更新:我似乎记得至少有一些Lisps允许你将函数打印成代码(例如,Scheme的漂亮打印函数)。

答案 3 :(得分:1)

这是电子表格的工作方式。

它还与call by name语义相关,用于评估函数参数。 Algol 60有这个,但它没有流行起来,实施起来太复杂了。

答案 4 :(得分:1)

编程语言Lucid执行此操作,但它调用xy“stream”而不是函数。 该计划将写成:

y
  where
    y = x + 4
  end

然后你输入:

 x(0): 2
   y = 6
 x(1): 5
   y = 7

当然,Lucid(就像大多数有趣的编程语言一样)相当模糊,所以我并不感到惊讶,没有其他人找到它。 (或寻找它)

答案 5 :(得分:0)

尝试查看F#hereWikipedia关于函数式编程语言的内容。

我自己还没有研究过这些类型的语言,因为我一直专注于OOP,但是一旦F#出来,很快就会钻研。

希望这有帮助!

答案 6 :(得分:0)

我最近看到的这些是图表组件中技术分析系统的一部分。 (Tradestation,metastock等),但主要是他们专注于返回多组元数据(例如买/卖信号),然后可以将其输入到接受元数据或财务数据或直接绘制的其他函数中。

我的2c: 我会说你所建议的一种语言至少可以说是非常混乱。函数通常是r值,这是有充分理由的。这段代码(javascript)显示了如何将函数强制化为r值,从而提高了可读性(从而提高了维护性):

var x = 2;
var y = function() { return x+2; }
alert(y());
x= 5;
alert(y());

答案 7 :(得分:0)

Self不区分字段和方法,两者都是插槽,可以完全相同的方式访问。一个插槽可以包含一个值或一个函数(所以这两个仍然是单独的实体),但区别对于插槽的用户无关紧要。

答案 8 :(得分:0)

在Scala中,函数中有惰性值和按名称调用的参数。

def foo(x : => Int) {
    println(x)
    println(x) // x is evaluated again!
}

在某种程度上,这可以产生您所寻找的效果。

答案 9 :(得分:-1)

我相信像OctaveRMaxima这样的数学导向语言就是这样做的。我可能是错的,但没有人提到它们,所以我想我会。