Haskell中一元运算符的前缀形式

Haskell中一元运算符的前缀形式,haskell,ghci,unary-operator,prefix-operator,Haskell,Ghci,Unary Operator,Prefix Operator,在GHCi中: 序曲>(+3)2 五, 序曲>(*3)2 六, 序曲>(/3)2 0.66666666 前奏曲>(-3)2 (Num(t->t1))没有实例 源于1:2处的文字3' 可能的修复方法:为(Num(t->t1))添加实例声明 在表达式中:3 在表达式中:(-3)2 在it的定义中:it=(-3)2 如何更正最后一个,使其返回-1?Haskell的语法不允许您这样使用-。改用减法功能: (subtract 3) 2 你能行 (-) 3 2 但这会给你1。要得到-1,需要将3绑定到-,

在GHCi中:

  • 序曲>(+3)2
    五,
  • 序曲>(*3)2
    六,
  • 序曲>(/3)2
    0.66666666
  • 前奏曲>(-3)2
    (Num(t->t1))没有实例
    源于1:2处的文字
    3'
    可能的修复方法:为(Num(t->t1))添加实例声明
    在表达式中:3
    在表达式中:(-3)2
    it的定义中:it=(-3)2

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

    Haskell的语法不允许您这样使用
    -
    。改用
    减法
    功能:

    (subtract 3) 2
    你能行

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

    flip (-) 3 2
    
    作为脚注,以下是以下文件中的相关段落:

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

    当我第一次遇到它时,这让我很沮丧:我不明白为什么在这个上下文中,当
    :info(+)
    :info(-)
    看起来基本相同时,操作符的行为会如此不同

    您可以使用grddev建议的
    减法
    ,也可以定义一个新的中缀运算符:

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

    subtract
    的优点是,其他人可能会熟悉您的代码。

    如果您想保持原始形状,可以添加负片:

    (+ -3)
    

    它不漂亮,但更符合你的模式。

    是的,他应该说
    (+(-3))
    。要生成负数,需要使用括号中的
    -
    和数字。另一种(可能有点难看)方法是
    (-3+)2