问题
In GHCi:
- Prelude> (+3) 2
5- Prelude> (*3) 2
6- Prelude> (/3) 2
0.6666666666666666- Prelude> (-3) 2
No instance for (Num (t -> t1))
arising from the literal3\' at <interactive>:1:2
it\': it = (- 3) 2
Possible fix: add an instance declaration for (Num (t -> t1))
In the expression: 3
In the expression: (- 3) 2
In the definition of
How can I correct the last one to make it return -1?
回答1:
Haskell's grammar doesn't allow you to use -
like that. Use the subtract
function instead:
(subtract 3) 2
回答2:
As a footnote to grddev's answer, here's the relevant paragraph from the Haskell 98 Report:
The special form
-e
denotes 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 thenegate
function defined in the Prelude. There is no link between the local meaning of the-
operator and unary negation.
This is something that frustrated me when I first came across it: I couldn't understand why the operators behaved so differently in this context when :info (+)
and :info (-)
looked basically identical.
You could use subtract
, as grddev suggests, or you could just define a new infix operator:
Prelude> let (#) = (-)
Prelude> (# 3) 2
-1
subtract
has the advantage of being familiar to other people who might read your code.
回答3:
You can do
(-) 3 2
but that will give you 1. To have -1, you need to bind the 3 to the second argument of -, which you can do using
flip (-) 3 2
回答4:
If you're intent on keeping your original shape, you can always add the negative:
(+ -3)
It ain't pretty, but it fits your pattern a little bit more.
来源:https://stackoverflow.com/questions/3406320/prefix-form-of-unary-operator-in-haskell