在 Racket 中将 Exact-Rational 转换为 Integer
Posted
技术标签:
【中文标题】在 Racket 中将 Exact-Rational 转换为 Integer【英文标题】:Convert an Exact-Rational to an Integer in Racket 【发布时间】:2022-01-12 13:45:51 【问题描述】:我正在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
。
我知道整数是 Exact-Rational (source) 的子集。有什么办法可以让我的代码类型检查?也许通过将失败表达式返回的值转换为 Integer
?
非常感谢
【问题讨论】:
【参考方案1】:(我分享我找到的答案)
由于index
被标记为Integer
,它可以是正整数、空整数或负整数。因此,(expt 2 index)
可以返回一个有理数(例如,如果 index
为负数)。
如果index
被标记为Nonnegative-Integer
,则函数类型检查。
【讨论】:
以上是关于在 Racket 中将 Exact-Rational 转换为 Integer的主要内容,如果未能解决你的问题,请参考以下文章