Haskell “之间的语义区别是什么?”;varid"&引用;varsym“;在哈斯克尔报告中?

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

我正在阅读Haskell报告2010,对第2.4节中的元逻辑表示法有一些疑问:

  • 在“varid”和“varsym”的助记符中,“var”是指变量吗
  • 我的理解是,“varid”是变量和函数的标识符,而“varsym”也是标识符,但用于运算符。这种理解正确吗
  • 如果1和2是正确的,是否意味着运算符也是一种变量?(我很困惑,因为这可能不对。)

  • 感谢您的建议。

    据我所知,报告定义了前缀符号和中缀符号之间的区别,例如:

    f x y -- f is used prefix
    
    a / b -- / is used infix
    
    这只是一种语法上的便利,因为所有的前缀符号都可以使用带有反勾号的中缀,所有的中缀符号都可以使用带有
    ()
    s的前缀:

    分问题:

  • 是的,但是我不能为
    id
    sym
    部分找出任何有意义的助记符:(

  • 运算符属于Haskell语法的范畴,而不是它的语义。它们只用于为编写某些表达式提供更方便的语法。据我所知,如果将它们从Haskell中删除,唯一的损失就是方便的语法——也就是说,除了方便的语法之外,没有什么需要运算符的,您可以将运算符的每次使用都与非运算符符号放在一起。它们与变量完全相同,它们是变量,但使用时需要不同的语法

  • 是的,我同意运算符符号是变量。但是,绑定到oerators符号的值不是变量


  • 运算符肯定是一种变量,除了以
    开头的运算符是构造函数之外。但是,在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