Zumi Zoom
06/25/2025, 8:43 AMxuwei-k
06/25/2025, 8:45 AMInt
にしただけだけど、singleton typeにしたい場合もあるしなwindymelt
06/25/2025, 9:22 AMxuwei-k
06/25/2025, 9:43 AMKory
06/27/2025, 2:38 PMKory
06/27/2025, 2:43 PMKory
06/27/2025, 2:46 PMScala
case class LatticePoint(x: Int, y: Int)
class LatticePointTracked[X <: Int, Y <: Int](x: X, y: Y) extends LatticePoint(x, y)
val lp3: LatticePointTracked[Int, 3] = LatticePointTracked(10, 3)
val lp3Upcast: LatticePoint { val y: 3 } = lp3
val lp3UpcastOneLine: LatticePoint { val y: 3 } = LatticePointTracked(10, 3)
case class
を extends
してやれば(かなりやりたくないですが)一応 Scala 3.6.3 でもいけそうですね でも case class
を extends
したくない… 🥹(そもそも final
の気持ちで居たい…)Kory
06/27/2025, 2:51 PMapply()
) は引数に関する正確な型情報というのを (引数を、↑のコードの LatticePointTracked
にあるように、それに対応する型引数と共に受け付けたりしない限り) 基本的に完全に捨てていて、例えば
scala
case class LatticePoint(x: Int, y: Int)
type PositiveInt <: Int // Iron などで得られる refinement type
val x1: Int = -3
val y1: PositiveInt = 5
val ptInUpperHalfPlane: LatticePoint = LatticePoint(x1, y1)
と書いたときに、`ptInUpperHalfPlane.y` が実のところただの Int
ではなくて、もっと強く PositiveInt
であったのだ、という情報は永久に失われることになります。これを tracked
って書くだけでもっと正確な型を付けられるようにしましょう、という proposal だと理解しています 👀Zumi Zoom
06/27/2025, 2:51 PMKory
06/27/2025, 2:52 PMKory
06/27/2025, 2:54 PMScala
final case class LatticePoint(x: Int, y: Int)
として宣言されているような場合ですと、`LatticePoint` をこれ以上 refine するのは不可能そうです(`LatticePoint` を構築するような式があったとき、その式には (path dependent type 以外の) LatticePoint
の部分型が付くことがあり得ないので、`LatticePoint { x : 42 }` のような型の値を構築できなくなってしまうと思います)Zumi Zoom
06/27/2025, 3:23 PMxuwei-k
06/28/2025, 3:23 AMunarist
07/10/2025, 8:46 AM$ scala-cli
Welcome to Scala 3.7.0 (11.0.4, Java OpenJDK 64-Bit Server VM).
Type in expressions for evaluation. Or try :help.
scala> Seq.empty[[T >: Int] =>> T => ?].head(1)
Exception in thread "main" java.lang.AssertionError: assertion failed: invalid prefix HKTypeLambda(List(T), List(TypeBounds(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int),TypeRef(ThisType(TypeRef(NoPrefix,module class scala)),class Any))), AppliedType(TypeRef(ThisType(TypeRef(NoPrefix,module class scala)),trait Function1),List(TypeParamRef(T), TypeBounds(TypeRef(ThisType(TypeRef(NoPrefix,module class scala)),class Nothing),TypeRef(ThisType(TypeRef(NoPrefix,module class scala)),class Any)))))
at scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:8)
at dotty.tools.dotc.core.Types$NamedType.<init>(Types.scala:2301)
at dotty.tools.dotc.core.Types$TypeRef.<init>(Types.scala:2938)
at dotty.tools.dotc.core.Types$CachedTypeRef.<init>(Types.scala:2995)
...
unarist
07/10/2025, 10:28 AMunarist
07/11/2025, 6:57 AMxuwei-k
07/11/2025, 8:39 AMwindymelt
07/11/2025, 5:32 PMunarist
07/11/2025, 6:09 PMunarist
07/14/2025, 7:51 PM.map(X)
が .map(X.apply)
じゃなくて .map(.applyX)
に書き換えられるケースがあって謎…条件がよくわからない…xuwei-k
07/24/2025, 11:43 AMxuwei-k
07/30/2025, 4:36 AMxuwei-k
08/01/2025, 9:49 PMxuwei-k
08/01/2025, 11:32 PMxuwei-k
08/02/2025, 1:51 AMxuwei-k
08/02/2025, 3:30 AMxuwei-k
08/02/2025, 8:20 AMxuwei-k
08/22/2025, 2:04 AMtanishiking
08/25/2025, 11:12 AMwindymelt
08/25/2025, 3:24 PM