我正在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
,则函数类型检查。