Burning more bridges (mostly numeric ones)

Henning Thielemann schlepptop at henning-thielemann.de
Sun Mar 23 18:25:54 UTC 2014

```Am 23.03.2014 09:50, schrieb Bart Massey:

>>> * The multiplicity of exponentiation functions, one of which looks
>>> exactly like C's XOR operator, which I've watched trip up newbies a
>>> bunch of times. (Indeed, NumericPrelude seems to have added more of
>>> these, including the IMHO poorly-named (^-) which has nothing to do
>>> with numeric negation as far as I can tell. See "unary negation"
>>> above.)
>>
>> It is unfortunate, but there really is a distinction being made.
>
> I get that. I even get that static-typing exponentiation is hard. (You
> should see how
> we did it in Nickle (http://nickle.org) --not because it's good but because
> it calls out a lot of the problems.) What I don't get is why the names seem
> so terrible to me, nor why the typechecker can't do more to help reduce the
> number of needed operators, ideally to one. It might mean extra conversion
> operators around exponentiation once in a while, I guess?

I think the power functions of Haskell are the best we can do, and
mathematics is to blame for having only one notation for different power
functions.

I like to compare it to division. In school we first learnt natural
numbers and that division cannot always be performed with natural
numbers. Instead we have division with remainder. In contrast to that we
can always divide rational numbers (except division by zero). In Haskell
this is nicely captured by two different functions div and (/). The same
way I find it sensible to distinguish power functions.

I found the infix operator names (^^) and (**) not very intuitive and
defined (^-) and (^/) in NumericPrelude, in order to show, that the
first one allows negative exponents and the second one allows fractional
exponents. Unfortunately the first one looks like power function with
negated exponent and I had no better idea for an identifier so far.

```