函数是一种变量吗?

mod*_*ler 7 variables haskell function

我曾经认为变量作为数据和函数作为数据映射,它们在一般意义上是不同的东西.但是,在阅读某些语言标准(即Haskell)时,我发现该标准似乎将它们组合在一起(参见2.4和10.5,以及这个问题).

所以,我有一些关于变量和函数的问题(除问题标题外):

  1. 他们的语言特定意义(例如在Haskell中)是否也符合一般意义上的含义?
    (即前者是后者的一个子集.)或者一个意义有另一个的补充集?
    ("一般意义上"我的意思是数学.)
  2. "变量"的定义是什么?
    "有一个类型"是否定义了一个"成为变量"的东西?
  3. 我认为概念"功能"具有以下(结构化)方面.
    它的一个子方面确实有一个类型,那么,它是否使"函数"成为一个变量?
    功能(有方面的:)
    • 函数说明符/标识符:指定要引用的函数
    • 功能/映射:指定函数的功能,即它将哪些数据映射到哪些数据.(有方面的:)
      • 映射类型:例如在Haskell中,函数可以具有(a - > b)的类型

编辑:

摘要

在阅读完所有答案后(他们真的很棒),我意识到我的怀疑是由于"操作员"和"功能"之间的混淆:我把这两件事搞错了.正确的理解应该是:"操作员"只是一个指代"功能" 的符号.

请允许我借用E-Lisp Intro中的解释,我发现它非常有帮助:

我们可以根据我们到目前为止所讨论的内容阐明Lisp的另一个特征 - 一个重要特征:符号,如+,本身并不是计算机执行的指令集.相反,该符号可能暂时用作定位定义或指令集的方式.我们看到的是可以找到指令的名称.人们的名字以同样的方式工作.我可以被称为'鲍勃'; 然而,我不是字母'B','o','b',而是我或者是,意识始终与特定的生命形式相关联.这个名字不是我,但它可以用来指我.

Mat*_*ick 11

不,函数不是变量.函数是一个值(在Haskell,Python,JavaScript,Clojure和许多其他语言中,但不是在所有语言中).变量(或符号,标识符)可以引用或绑定到值.因此,变量/符号/标识符可以指代函数.

你的子问题:

  1. 恕我直言,是的.例如,数学中存在高阶逻辑.在数学中也存在常见的高阶函数,例如导数,积分和求和.

  2. 恕我直言,变量不是由"有一个类型"定义的 - 值也有类型,虽然可能在不同的意义上 - 而是由它们表示(代替,指向,指向)其他东西的能力.

    "什么是变量?" 应该被视为一个单独的问题,因为根据我的理解,准确的答案令人惊讶地复杂并植根于数学史.

  3. 不,函数具有类型的事实并不意味着它们是变量.

更仔细地阅读你的问题,我认为这里有两个不同的问题:1)"是"什么东西?2)不同事物之间的相似之处.因此,虽然您已经确定了变量和函数之间的相似性,但这并不意味着函数"是"变量,反之亦然.我会尽力说明这与Java示例(熊与我在这里!):假设你有两个类的Java程序,Variable并且Function,和你想知道如何建立它们之间的继承关系.我的答案是,我认为没有一个 - 没有一个继承自另一个 - 但你不需要一个,因为你可以创建接口捕获你感兴趣的方面,然后实现这些接口对于这两个班级.


J. *_*son 6

函数是一个看起来像的语法形式

\ x -> E
Run Code Online (Sandbox Code Playgroud)

以及一些变化.如果表达式E具有类型b且对xin的所有引用E都具有类型,a那么整个表达式的类型为a -> b.

相反,类似take或者(.)是一个变量.事实证明,在每种情况下,该变量的类型都是这种形式,a -> b因此变量代表一个函数.

由于Haskell是纯粹的,我们保证用它代表的值替换变量不会改变程序的含义.

(我暂时忽略了句法形式和价值观之间的区别 - 你可以长时间模糊这种区别而不会有太多麻烦.)

这种自由取代参考的价值观念是数学变量的典型意义 - 虽然不是反映它的最核心方式.

通常,变量是未知的,可能受到任何数量的限制.例如,它可以参与方程组,并被约束为该系统的解决方案

a = (True, a)  -- invalid Haskell, but a valid concept! What is "a" here?
Run Code Online (Sandbox Code Playgroud)

Haskell变量不能直接定义:变量可以参与的递归方程的种类有限制,这些是由Haskell的类型判断给出的.

但是,尽管我试图区分"典型"数学变量和Haskell变量,但两者在FAR中比其他计算机语言中的"变量"更相似.那些可能更好地命名为"mutables"或"assignables".

最后,函数的本质是什么?如果您通过变量引用或语法形式"拥有"函数,则可以其应用于参数.这导致一种形式的可变替换发生.我们已经说过变量可以在引用某些变量时自由替换 - 为什么我们需要函数?

因为函数的构造产生了包含绑定变量的上下文.这些变量是仅在函数体内有意义的变量,并且在应用函数并且局部气泡上下文融化回程序之前不能采用任何实际参考.

通常,函数和变量具有复杂的相互作用.学习(打字或无类型)lambda演算就是这个.

  • 我不认为将Haskell函数与句法形式等同起来是一个非常好的简化.句法形式*表示*Haskell函数.我认为Haskell函数本身可能最好简化为*mathematical*函数,从某种类型的元素集合到某种类型的元素集合.主要的实际复杂因素可能是每种类型都存在`_ | _`,但从概念上来说,这似乎并不那么难.我认为,Haskell解决方程式找到最不确定的解决方案的概念也不存在.(续) (2认同)