gpt4 book ai didi

数值实数范围的 Scala 数据类型

转载 作者:行者123 更新时间:2023-12-02 20:38:10 24 4
gpt4 key购买 nike

是否有一些惯用的 scala 类型将浮点值限制为由上限和下限定义的给定浮点范围?

具体我想要一个浮点类型,只允许具有 0.0 和 1.0 之间的值。

更具体地说,我将编写一个接受 Int 的函数和另一个将这个 Int 映射到 0.0 到 1.0 之间范围的函数,以伪 scala 形式:

def foo(x : Int, f : (Int => {0.0,...,1.0})) {
// ....
}

已经搜索了版 block ,但没有找到合适的内容。一些隐式魔法或自定义 typedef 对我来说也可以。

最佳答案

我不知道如何静态地执行此操作,除了 Scala 没有的依赖类型 ( example )。如果您只处理常量,则应该可以使用宏或编译器插件来执行必要的检查,但如果您有任意浮点类型表达式,则很可能必须诉诸运行时检查。

这是一种方法。定义一个执行运行时检查的类,以确保浮点值在所需的范围内:

abstract class AbstractRangedFloat(lb: Float, ub: Float) {
require (lb <= value && value <= ub, s"Requires $lb <= $value <= $ub to hold")

def value: Float
}

您可以按如下方式使用它:

case class NormalisedFloat(val value: Float)
extends AbstractRangedFloat(0.0f, 1.0f)

NormalisedFloat(0.99f)
NormalisedFloat(-0.1f) // Exception

或者如:

case class RangedFloat(val lb: Float, val ub: Float)(val value: Float)
extends AbstractRangedFloat(lb, ub)

val RF = RangedFloat(-0.1f, 0.1f) _
RF(0.0f)
RF(0.2f) // Exception

如果可以使用 value classes 那就太好了为了获得一些性能,但构造函数中对 requires 的调用(当前)禁止这样做。


编辑:解决@paradigmatic的评论

这是一个直观的论据,为什么依赖于自然数的类型可以在不(完全)支持依赖类型的类型系统中进行编码,但范围 float 可能不能:自然数是可枚举的set,这使得可以将每个元素编码为 path-dependent types using Peano numerals 。然而,实数不再是可枚举的,因此不再可能系统地创建与实数的每个元素相对应的类型。

现在,计算机 float 和实数最终都是有限集,但仍然很大,无法在类型系统中合理有效地枚举。计算机自然数的集合当然也非常大,因此对编码为类型的皮亚诺数字的算术提出了问题,请参见this article的最后一段。 。然而,我声称使用前 n (对于相当小的 n)自然数通常就足够了,例如 HLists 所证明的那样。 。对 float 做出相应的声明不太令人信服 - 编码 0.0 到 1.0 之间的 10,000 个 float 更好,还是 0.0 到 100.0 之间的 10,000 个 float 更好?

关于数值实数范围的 Scala 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16586934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com