【问题标题】:$ operator in Haskell gives data constructor errorHaskell 中的 $ 运算符给出数据构造函数错误
【发布时间】:2015-03-13 15:10:10
【问题描述】:

1:([2]) 按预期工作。

1:$[2]<interactive>:15:2: Not in scope: data constructor `:$'

我认为$ 运算符将其后面的所有内容括起来: Haskell: difference between . (dot) and $ (dollar sign)

发生了什么事?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    您将$ 放在函数和值之间,它会将函数应用于值。

    1: 不是函数,但(1:) 是,所以你可以使用(1:) $ [2],但不能使用1: $ [2]

    (你得到的错误是因为没有空格,编译器认为:$是一回事,而不是两个,并且以:开头的运算符是数据构造函数,就像以大写字母开头的函数是数据构造函数一样。)

    【讨论】:

    • 感谢您的回答和对错误信息的解释。你能解释一下为什么:1 不是一个函数吗?如果1:[2] 给出[1,2],这意味着:: :: a -> [a] -> [a]。通过柯里化1: 将给出[a] -> [a] 这是一个函数。就算这不正确,()是怎么变成函数的?
    • 称为算子部分,是偏应用的一种形式。运算符接受两个参数,但如果您提供其中一个并将其放在括号中,编译器会将其视为剩余一个参数的函数,并且您可以执行通常可以对函数执行的任何操作。示例:(+7) 是一个添加 7 的函数,("Hi, "++) 在字符串前面添加,(' ':) 在字符串前面添加空格。
    • 非常感谢您的任期。我在这里找到了更多信息:wiki.haskell.org/Section_of_an_infix_operator
    【解决方案2】:

    $ 运算符不是语法,它只是一个普通函数,就像其他函数一样。当你写

    1 :$ [2]
    

    编译器看到的第一个问题是:$ 显示为它自己的运算符(考虑+ +++,它们是非常不同的东西),但:$ 没有在任何地方定义。

    如果你要写作

    1 : $ [2]
    

    然后编译器不知道该怎么做,因为您有两个相邻的运算符,这是不允许的,就像 1 + * 2 是不允许的一样。这些表达根本没有任何意义。 $ 运算符实际上只是定义为

    f $ x = f x
    

    但它的优先级较低,如Please Excuse My Dear Aunt Sally 用于算术运算符优先级,因此您可以更轻松地进行链接操作。它实际上并不在表达式中插入括号。

    【讨论】:

    • 我认为这个答案比我的更值得称赞,但到目前为止只有一个人加入了我的观点。
    • @AndrewC 你的回答还是不错的,你先把它贴出来了,你提到了运营商部分,我没能做到。我不介意代表,在这一点上我没有更多的特权,we're pretty closely matched on the haskell tag anyway =P
    • 非常感谢您的解释。我今天学到了很多新东西。
    【解决方案3】:

    $ 并不是在任意代码周围放置括号,而是更改函数的求值顺序(就像括号一样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      相关资源
      最近更新 更多