来自haskell文档:
标识符在词法上被区分为两个名称空间(第1.4节):以小写字母开头的那些(变量 标识符)以及以大写字母开头的标识符 (构造函数标识符)。
所以包含常量值的变量,即a=4
和函数名称add add a b = a + b
都是变量标识符,是吗?我们可以说函数名是可变的吗?
来自另一个学术来源:
f (patter1)...(pattern2) = expression
..模式可以是构造函数或变量,而不是已定义的 功能
这是我感到困惑的地方。正如我可以做f g x
其中g是一个函数,我再次看到函数名是一个变量。真正?
那么“未定义的定义函数”是什么意思呢?
答案 0 :(得分:6)
函数名称可以是变量标识符,除非它是+
之类的运算符。
这是关于词汇事项的陈述。 你无法从中推断出函数名是一个变量。 (因为变量不是词汇的东西。)
反过来,就像在
中一样f . g = \a -> f (g a)
其中f
和g
是变量,即绑定到某些未知的未知值的名称,但我们知道这些值必须是函数。
答案 1 :(得分:0)
命名函数确实只是一个全局变量,其“值”恰好是一个函数。例如,
id x = x
也可以写成
id = ( \ x -> x )
Haskell明确地区分了这两者。甚至类型签名都说明了:
id :: x -> x
因此id
只是值为x -> x
的值的值(即函数)。
其他人说过运营商不是变量;这是不真实的。
let (<+>) = \ x y -> (x+y)/(x*y) in 5 <+> 6
你甚至可以做一些完全可怕的事情,比如写一个循环,其中<+>
的内容每次都会在循环中发生变化。 (但为什么有人会这样做呢?)