es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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ón inexact->exact, que convierte un número inexacto a un número exacto:

    #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 (inexact->exact (* v (expt 2 index)))))))
    

    En el código anterior, usamos inexact->exact para convertir el producto (* v (expt 2 index)) a un Integer exacto antes de sumarlo a result. Esto asegura que la expresión (+ result (* v (expt 2 index))) devuelva un Integer como se espera.

    ¡Espero que esto te ayude!

Comments are closed.