откуда вы связали уведомление fromIntegerNat :
||| Convert an Integer to a Nat, mapping negative numbers to 0
fromIntegerNat : Integer -> Nat
fromIntegerNat 0 = Z
fromIntegerNat n =
if (n > 0) then
S (fromIntegerNat (assert_smaller n (n - 1)))
else
Z
и fromInteger в реализации Num Nat:
Num Nat where
(+) = plus
(*) = mult
fromInteger = fromIntegerNat
и Cast Integer Nat
||| Casts negative `Integers` to 0.
Cast Integer Nat where
cast = fromInteger
В случае Idris1 он попытается выполнить приведение из литерала (такого как Char, String или Integer) в любой требуемый тип с помощью этих «fromFunctions» (как указано в комментарии в одном из вышеперечисленных источников: [...] '-5' desugars to 'negate (fromInteger 5)'
), и в целом Idris1 поддерживает неявное приведение типов для любых двух типов. (http://docs.idris-lang.org/en/latest/tutorial/miscellany.html#implicit -конверсии )
В случае с Idris2 есть некоторые прагмы (%charLit fromChar
, %stringLit fromString
, %integerLit fromInteger
) для подсказки компилятор использовать некоторую функцию приведения из литерала в любой другой тип.