Haskell “之间的语义区别是什么?”;varid"&引用;varsym“;在哈斯克尔报告中?
我正在阅读Haskell报告2010,对第2.4节中的元逻辑表示法有一些疑问:Haskell “之间的语义区别是什么?”;varid"&引用;varsym“;在哈斯克尔报告中?,haskell,Haskell,我正在阅读Haskell报告2010,对第2.4节中的元逻辑表示法有一些疑问: 在“varid”和“varsym”的助记符中,“var”是指变量吗 我的理解是,“varid”是变量和函数的标识符,而“varsym”也是标识符,但用于运算符。这种理解正确吗 如果1和2是正确的,是否意味着运算符也是一种变量?(我很困惑,因为这可能不对。) 感谢您的建议。据我所知,报告定义了前缀符号和中缀符号之间的区别,例如: f x y -- f is used prefix a / b -- / is used
感谢您的建议。据我所知,报告定义了前缀符号和中缀符号之间的区别,例如:
f x y -- f is used prefix
a / b -- / is used infix
这只是一种语法上的便利,因为所有的前缀符号都可以使用带有反勾号的中缀,所有的中缀符号都可以使用带有()
s的前缀:
分问题:
id
和sym
部分找出任何有意义的助记符:(运算符肯定是一种变量,除了以
:
开头的运算符是构造函数之外。但是,在GHC中,如果提供适当的选项,则在类型级别的工作方式会有所不同。运算符可以是类型构造函数,但不能是类型变量。这是合理的,因为很少希望运算符是类型变量,但人们很可能希望它是一个类型构造函数。请注意,在(+)*4中写入let(+)=5是完全合法的,并且let(+)=5 in 3+4
将产生类型错误,而不是语法错误。@dfeuer我认为变量存储数据,而运算符(一种函数)映射数据。两种不同的存在,不是吗?当你有一个操作符+
时,你“真正”拥有的是一个变量(+)
,还有解析器中的魔法,它将a+b
转化为(+)a b
,以及类似的特殊规则,这些规则的具体细节我记不起来了
。谢谢你的回答。因此,运算符就像C中指向实际函数的函数指针,对吗?@modeler通过类比很难正确定义事物。:(Haskell中的运算符符号不必绑定到函数。请尝试let(+)=3 in(+)
。实际上,运算符符号只是变量,具有不同的语法要求。@Modeler,我认为Matt Fenwick的解释很好;我只是想强调,“函数指针”之类的概念与任何常见的Haskell概念都相去甚远。
x `f` y -- infix
(/) a b -- prefix
(a /) b -- operator section
(/ b) a -- operator section