首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >haskell中的函数名vs变量

haskell中的函数名vs变量
EN

Stack Overflow用户
提问于 2014-01-13 00:38:05
回答 2查看 433关注 0票数 0

来自haskell文档: 标识符在词汇上分为两个名称空间(第1.4节):以小写字母(变量标识符)开头的名称空间和以大写字母开头的名称空间(构造函数标识符)。

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

来自另一个学术来源: F(Patter1).(Pattern2)=表达式 ..where模式可以是构造函数或变量,而不是定义的函数。

这就是我困惑的地方。正如我可以做的那样,在g是一个函数的情况下,我再次看到函数名是变量。是真的?那么,“未定义的函数”是什么意思呢?

EN

回答 2

Stack Overflow用户

发布于 2014-01-13 00:49:04

函数名可以是变量标识符,除非它是像+这样的运算符。

这是一篇关于词法 matters的声明。您不能由此推断函数名是一个变量。(因为变量不是词汇。)

情况正好相反,就像在

代码语言:javascript
运行
复制
f . g = \a -> f (g a)

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

票数 6
EN

Stack Overflow用户

发布于 2014-01-14 11:26:50

命名函数实际上只是一个全局变量,它的“值”恰好是一个函数。例如,

代码语言:javascript
运行
复制
id x = x

还不如写成

代码语言:javascript
运行
复制
id = ( \ x -> x )

哈斯克尔没有明确区分这两种情况。甚至类型签名也是这样写的:

代码语言:javascript
运行
复制
id :: x -> x

因此,id只是一个值,它的值具有x -> x类型(即函数)。

有人说运算符不是变量,这是不正确的。

代码语言:javascript
运行
复制
let (<+>) = \ x y -> (x+y)/(x*y) in 5 <+> 6

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21082242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档