Prefix form of unary operator in Haskell

本小妞迷上赌 提交于 2019-11-27 05:38:01

Haskell's grammar doesn't allow you to use - like that. Use the subtract function instead:

(subtract 3) 2
Travis Brown

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 for negate (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 the negate 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.

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

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!