首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编译时强制执行向量的Scala大小

编译时强制执行向量的Scala大小
EN

Stack Overflow用户
提问于 2013-02-07 07:45:42
回答 2查看 941关注 0票数 11

有没有可能在编译时强制传递给方法的Vector的大小?我想使用空间中的一组点对n维欧几里得空间进行建模,如下所示(这就是我现在拥有的):

代码语言:javascript
运行
复制
case class EuclideanPoint(coordinates: Vector[Double]) {
  def distanceTo(desination: EuclieanPoint): Double = ???
}

如果我有一个通过EuclideanPoint(Vector(1, 0, 0))创建的坐标,它就是一个三维欧几里得点。鉴于此,我希望确保在对distanceTo的调用中传递的目标点具有相同的维度。

我知道我可以通过对Tuple22使用Tuple1来做到这一点,但我想表示许多不同的几何空间,如果使用Tuples,我将为每个空间编写22个类--有没有更好的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-07 08:52:09

可以通过许多方式来实现这一点,这些方式看起来或多或少都像Randall Schulz在评论中描述的那样。Shapeless library提供了一个特别方便的实现,它可以让您获得与您想要的非常接近的东西,如下所示:

代码语言:javascript
运行
复制
import shapeless._

case class EuclideanPoint[N <: Nat](
   coordinates: Sized[IndexedSeq[Double], N] { type A = Double }
) {
  def distanceTo(destination: EuclideanPoint[N]): Double = 
    math.sqrt(
      (this.coordinates zip destination.coordinates).map {
        case (a, b) => (a - b) * (a - b)
      }.sum
    )
}

现在,您可以编写以下代码:

代码语言:javascript
运行
复制
val orig2d = EuclideanPoint(Sized(0.0, 0.0))
val unit2d = EuclideanPoint(Sized(1.0, 1.0))

val orig3d = EuclideanPoint(Sized(0.0, 0.0, 0.0))
val unit3d = EuclideanPoint(Sized(1.0, 1.0, 1.0))

和:

代码语言:javascript
运行
复制
scala> orig2d distanceTo unit2d
res0: Double = 1.4142135623730951

scala> orig3d distanceTo unit3d
res1: Double = 1.7320508075688772

但不是:

代码语言:javascript
运行
复制
scala> orig2d distanceTo unit3d
<console>:15: error: type mismatch;
 found   : EuclideanPoint[shapeless.Nat._3]
 required: EuclideanPoint[shapeless.Nat._2]
              orig2d distanceTo unit3d
                                ^

Sized有很多不错的特性,包括一些带有静态长度保证的集合操作。例如,我们可以编写以下代码:

代码语言:javascript
运行
复制
val somewhere = EuclideanPoint(Sized(0.0) ++ Sized(1.0, 0.0))

在三维空间中有一个普通的老点。

票数 12
EN

Stack Overflow用户

发布于 2013-02-07 12:59:15

你可以通过对自然数进行类型级编码来做一些自己的事情,比如:http://apocalisp.wordpress.com/2010/06/08/type-level-programming-in-scala/。然后只需通过Natural将向量参数化即可。不需要额外的依赖,但可能比使用Shapeless更复杂。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14741067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档