函数名称与haskell中的变量

时间:2014-01-13 00:38:06

标签: haskell syntax

  

来自haskell文档:

     
    

标识符在词法上被区分为两个名称空间(第1.4节):以小写字母开头的那些(变量     标识符)以及以大写字母开头的标识符     (构造函数标识符)。

  

所以包含常量值的变量,即a=4和函数名称add add a b = a + b都是变量标识符,是吗?我们可以说函数名是可变的吗?

  

来自另一个学术来源:

f (patter1)...(pattern2) = expression
     
    

..模式可以是构造函数或变量,而不是已定义的     功能

  

这是我感到困惑的地方。正如我可以做f g x其中g是一个函数,我再次看到函数名是一个变量。真正? 那么“未定义的定义函数”是什么意思呢?

2 个答案:

答案 0 :(得分:6)

函数名称可以是变量标识符,除非它是+之类的运算符。

这是关于词汇事项的陈述。 你无法从中推断出函数名是一个变量。 (因为变量不是词汇的东西。)

反过来,就像在

中一样
f . g = \a -> f (g a)

其中fg是变量,即绑定到某些未知的未知值的名称,但我们知道这些值必须是函数。

答案 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

你甚至可以做一些完全可怕的事情,比如写一个循环,其中<+>的内容每次都会在循环中发生变化。 (但为什么有人会这样做呢?)