Search code examples
haskellinfix-operator

Why is the unary minus operator problematic in this expression: (- 2) 1?


All of the following expressions get evaluated without mishap:

(+2) 1 -- 3
(*2) 1 -- 2
((-)2) 1 -- 1
(2-) 1 -- 1   
(/2) 1 -- 0.5
(2/) 1 -- 2.0

but not this one:

(-2) 1 -- the inferred type is ambiguous

GHC throws some error about the inferred type being ambiguous. Why?


Solution

  • The first six parenthesised expressions are sections, i.e. functions that take one argument and "put it on the missing side of the infix operator" (see this haskell.org wiki). In contrast, (-2) is, not a function, but a number (negative 2):

    λ> :t (-2)
    (-2) :: Num a => a
    

    If you write

    λ> (-2) 1
    

    it looks like you're trying to apply (-2) (a number) to 1 (which is not possible), and GHCi rightfully complains:

    Could not deduce (Num (a0 -> t))
      arising from the ambiguity check for ‘it’
    from the context (Num (a -> t), Num a)
      bound by the inferred type for ‘it’: (Num (a -> t), Num a) => t
      at <interactive>:3:1-6
    The type variable ‘a0’ is ambiguous
    When checking that ‘it’
      has the inferred type ‘forall a t. (Num (a -> t), Num a) => t’
    Probable cause: the inferred type is ambiguous
    

    If you want a function that subtracts 2 from another number, you can use

    (subtract 2)
    

    Compare its type,

    λ> :t (subtract 2)
    (subtract 2) :: Num a => a -> a
    

    to that of (-2) (see above).


    Terminology addendum (after OP's edit)

    Parenthesizing the minus operator turns it into a normal (prefix) function that takes two arguments; therefore ((-) 2) is not a section, but a partially applied function.