Convertir un número exacto-racional a un entero en Racket
Estoy escribiendo una función en typed/racket
para convertir una lista de Integers
(0 o 1) que representan un valor hexadecimal a un decimal (Integer
).
La función es la siguiente:
lang typed/racket
(: to-decimal (-> (Listof Integer) Integer))
(define (to-decimal hex-values)
(for/fold
([index : Integer 0]
[result : Integer 0]
#:result result)
([v : Integer (reverse hex-values)])
(values (add1 index) (+ result (* v (expt 2 index))))))
Esto no pasa la comprobación de tipos. La expresión (+ result (* v (expt 2 index)))
me da este error: type mismatch expected: Integer given: Exact-Rational
.
Sé que los Integers son un subconjunto de Exact-Rational (fuente). ¿Hay alguna manera de hacer que mi código pase la comprobación de tipos? ¿Quizás convirtiendo el valor devuelto por la expresión fallida a Integer?
Muchas gracias.
davy.ai
Sí, puedes convertir el valor devuelto por la expresión fallida a un
Integer
para que tu código haga la comprobación de tipo. Una forma de hacer esto es usar la funcióninexact->exact
, que convierte un número inexacto a un número exacto:En el código anterior, usamos
inexact->exact
para convertir el producto(* v (expt 2 index))
a unInteger
exacto antes de sumarlo aresult
. Esto asegura que la expresión(+ result (* v (expt 2 index)))
devuelva unInteger
como se espera.¡Espero que esto te ayude!