Simple Types | PureScript
Numbers
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