So the literal 128 is not an Int but rather a number. This is a special type that says “I haven’t decided yet if I want this to be an integer or a float”.
If it gets used in a function that requires integers then the compiler decides it is going to be an integer. If it gets used in a function that requires floats then the compiler will decide it’s a float. And if it gets used in a function that allows either then the compiler will let it stay as a number.
You can read more about it in the official guide.
Examples from the REPL:
// is integer division and requires two ints and returns an int. Dividing 10 by 3 gives us back the expected int.
> (//)
<function> : Int -> Int -> Int
> 10 // 3
3 : Int
/ is float division and takes two floats and returns a float. Dividing 10 by 3 gives us back the expected float.
> (/)
<function> : Float -> Float -> Float
> 10 / 3
3.3333333333333335 : Float
+ takes two number and gives us back a number. Adding 10 and 3 gives us back the expected number.
> (+)
<function> : number -> number -> number
> 10 + 3
13 : number