gpt4 book ai didi

Scala结构类型和存在类型问题

转载 作者:行者123 更新时间:2023-12-04 15:59:05 25 4
gpt4 key购买 nike

我的问题是,在以下代码段中,c2 可以通过编译但 t2 失败。为什么?

  type PairT[A, B] = { //structural type
type T1 = A
type T2 = B
}
class PairC[A, B] {
type T1 = A
type T2 = B
}
case class TMap[A, B](a: A, b: B)
type MapC2[A] = TMap[p.T1, p.T2] forSome { val p: PairC[A, A] }
type MapT2[A] = TMap[p.T1, p.T2] forSome { val p: PairT[A, A] }
val c2: MapC2[Int] = TMap(1,2)
val t2: MapT2[Int] = TMap(1,2)

最佳答案

最近我遇到了一个有趣的 scala 谜题,它涉及存在类型和类型别名 (https://softwaremill.com/scala-riddle),我发现当类型别名不起作用时,我们应该尝试使用有界抽象类型成员。

我还没有想出任何模式可以告诉我在特定情况下我需要应用哪种类型的成员。
我在文档中找不到答案,也许这是一个实现细节?

我希望有人能帮我找到这样的模式,或者至少提供一些新的线索..

我是如何让你的代码工作的

内部 PairT我用严格限制的抽象类型( type T1 = A )替换了类型别名( type T1 >: A <: A )并且......它可以工作(scalac 2.11.4)。

更有趣的是-PairC ,这是一个具体的类,只能与类型别名一起使用 - 如果我尝试用有界抽象类型成员替换它们,则会引发编译错误。

以下是我修改后的整个代码:

package so1

import scala.language.existentials

object SOPuzzle {

type PairT[F, S] = {
type T1 >: F <: F
type T2 >: S <: S
}

class PairC[F, S] {
type T1 = F
type T2 = S
}

case class TMap[T, U](a: T, b: U) {
def consumeA(a: T): T = a
def consumeB(b: U): U = b
}

type MapC2[A] = TMap[p.T1, p.T2] forSome {val p: PairC[A, A]}

type MapC2V2[A] = TMap[PairC[A, A]#T1, PairC[A,A]#T2]

type MapT2[A] = TMap[p.T1, p.T2] forSome {val p: PairT[A, A]}

type MapT2V2[A] = TMap[PairT[A, A]#T1, PairT[A, A]#T2]

val c2: MapC2[Int] = TMap(1, 2)
val c2v2: MapC2V2[Int] = TMap(1, 2)
val t2: MapT2[Int] = TMap(1, 2)
val t2v2: MapT2V2[Int] = TMap(1, 2)

val i1:Int = c2.consumeA(0)
val i2:Int = c2.consumeB(0)

val i3:Int = c2v2.consumeA(0)
val i4:Int = c2v2.consumeB(0)

val i5:Int = t2.consumeA(0)
val i6:Int = t2.consumeB(0)

val i7:Int = t2v2.consumeA(0)
val i8:Int = t2v2.consumeB(0)
}

关于Scala结构类型和存在类型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17647667/

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