在Racket中将精确有理数转换为整数



我正在typed/racket中编写一个函数,将代表十六进制值的Integers(0或1(列表转换为十进制值(Integer(。

功能:

#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))))))

这无法进行类型检查。表达式(+ result (* v (expt 2 index)))给出了这个错误type mismatch expected: Integer given: Exact-Rational

我知道整数是ExactRational(源代码(的一个子集。有什么方法可以检查我的代码类型吗?也许通过将失败表达式返回的值转换为Integer

非常感谢

(我分享我找到的答案(

由于index被标记为Integer,它可以是正整数、空整数或负整数。因此,(expt 2 index)可以返回有理数(例如,如果index为负数(。

如果index标记为Nonnegative-Integer,则函数类型检查。

最新更新