Based on the position, the partial applications in Haskell gets the correct answer.
Prelude> (/2) 10
5.0
Prelude> (2/) 10
0.2
Prelude> (+3) 10
13
Prelude> (3+) 10
13
However, for - operator, I got an error with (-3) as Haskell (seems to) interprets it as a value -3 not partial application.
Prelude> (-3) 10
<interactive>:4:1:
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>:4:1-7
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
How to solve this issue to get 7 in this example?
Use subtract. - is the only operator in Haskell, that occurs both in a prefix and binary infix variant:
let a = -3 -- prefix variant
let b = (-3) -- also prefix variant!
let c = 4 - 3 -- binary variant
Therefore, you would have to use (subtract 3) 10. See also section 3.4 in the Haskell 2010 report (emphasis mine):
The special form
-edenotes prefix negation, the only prefix operator in Haskell, and is syntax fornegate (e). The binary-operator does not necessarily refer to the definition of-in the Prelude; it may be rebound by the module system. However, unary-will always refer to thenegatefunction defined in the Prelude. There is no link between the local meaning of the-operator and unary negation.Prefix negation has the same precedence as the infix operator
-defined in the Prelude (see Table 4.1 ). Becausee1-e2parses as an infix application of the binary operator-, one must writee1(-e2)for the alternative parsing. Similarly,(-)is syntax for(\ x y -> x-y), as with any infix operator, and does not denote(\ x -> -x)— one must usenegatefor that.
And section 3.5 concludes (again, emphasis mine):
Because
-is treated specially in the grammar,(- exp)is not a section, but an application of prefix negation, as described in the preceding section. However, there is asubtractfunction defined in the Prelude such that(subtract exp)is equivalent to the disallowed section. The expression(+ (- exp))can serve the same purpose.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With