Number Types#

Numbers can be of type Number and Int. Both are represented as normal JavaScript numbers at runtime. Int, however, has operations defined differently so that we always get integer results:

> div 7 2
3

> mod 7 2
1

> div 7.0 2.0
3.5

> mod 7.0 2.0
0.0

Note how div 7 2 results in 3, rather than 3.5. A number without a decimal is always considered an Int, while a number with a decimal is always considered a Number. Exponential notation always means the type is Number:

> 1
1

> :type 1
Int

> 1.0
1.0

> :type 1.0
Number

> 1e0
1.0

> :type 1e0
Number

> 1e-2
0.01

> :type 1e-2
Number

They Int-typed operations are made to return integers with some use of bitwise operators, as we can see in .spago/prelude/v6.0.0/src/Data/Ring.js:

export const intSub = function (x) {
  return function (y) {
    return x - y | 0;
  };
};

Typing a number#

As we saw, 1 is Int, while 1.0 or 1e0 is Number. We cannot force a value like 1 to be Number simply by adding a type annotation like in Haskell.

n :: Number
n = 1

The above will produce an error:

Could not match type
  Could not match type
    Int
  with type
    Number
while checking that type Int
  is at least as general as type Number
while checking that expression 1
  has type Number
in value declaration n
PureScript(TypesDoNotUnify)

Negative Numbers#

To make negative numbers, use the unary - operator (requires parenthesis) or the negate function.

> 1 + (-1)        
0

> 1 + negate 1    
0

References#