【问题标题】:Prefix form of unary operator in HaskellHaskell中一元运算符的前缀形式
【发布时间】:2010-08-04 14:05:50
【问题描述】:

在 GHCi 中:

  1. 前奏曲> (+3) 2
    5
  2. 前奏曲> (*3) 2
    6
  3. 前奏曲> (/3) 2
    0.6666666666666666
  4. 前奏曲> (-3) 2
    (Num (t -> t1)) 没有实例
    源于文字3' at <interactive>:1:2
    Possible fix: add an instance declaration for (Num (t -> t1))
    In the expression: 3
    In the expression: (- 3) 2
    In the definition of
    it': it = (- 3) 2

如何更正最后一个以使其返回 -1?

【问题讨论】:

    标签: haskell ghci unary-operator prefix-operator


    【解决方案1】:

    Haskell 的语法不允许你这样使用-。请改用subtract 函数:

    (subtract 3) 2

    【讨论】:

      【解决方案2】:

      作为grddev's answer 的脚注,以下是Haskell 98 Report 中的相关段落:

      特殊形式-e表示前缀 否定,唯一的前缀运算符 Haskell,是negate (e) 的语法。二进制 - 运算符不 必须参考的定义 -在前奏曲中;它可能会被模块系统反弹。然而,一元- 将始终参考negate Prelude 中定义的函数。那里 是本地意思之间没有联系 - 运算符和一元否定。

      当我第一次遇到它时,这让我很沮丧:我不明白为什么在 :info (+):info (-) 看起来基本相同的情况下,运算符的行为如此不同。

      您可以使用 subtract,正如 grddev 建议的那样,或者您可以定义一个新的中缀运算符:

      Prelude> let (#) = (-)
      Prelude> (# 3) 2
      -1
      

      subtract 的优点是对可能阅读您代码的其他人很熟悉。

      【讨论】:

        【解决方案3】:

        你可以的

        (-) 3 2
        

        但这会给你 1。要拥有 -1,你需要将 3 绑定到 - 的第二个参数,你可以使用

        flip (-) 3 2
        

        【讨论】:

          【解决方案4】:

          如果您打算保持原来的形状,您可以随时添加负片:

          (+ -3)
          

          它不是很漂亮,但它更适合你的模式。

          【讨论】:

          • 是的,他应该说(+ (-3))。要生成负数,您需要 - 和括号中的数字。
          • 另一种(可能有点难看)方式是(-3+) 2
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多