在 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的主要内容,如果未能解决你的问题,请参考以下文章

如何评价 Racket 这门编程语言?

Racket里的方括号

在 Racket 中设置默认参数值

为啥 Racket 中缺少单臂“如果”?

在 Scheme / Racket 中 let 的 lambda 定义是啥? [复制]

在 Racket 中需要 vs 加载 vs 包含 vs 导入