gpt4 book ai didi

Scalaz `Tag.apply` : How does it work?

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

嗨,我正在学习 Advanced Scala 书,但我在理解 scalaz 源代码中的这段代码时遇到了一些麻烦:

object Tag {
/** `subst` specialized to `Id`.
*
* @todo According to Miles, @specialized doesn't help here. Maybe manually specialize.
*/
@inline def apply[@specialized A, T](a: A): A @@ T = a.asInstanceOf[A @@ T]

// ...
}

它如何工作? a.asInstanceOf[A @@ T]应该因 ClassCastException 而失败,不是吗?

一个使用示例是:
Multiplication(2) |+| Multiplication(3) 

在这种情况下 a是一个 Int 如何将其转换为 @@[Int, Multiplication] ( Tagged[Int, Multiplication])

谢谢您的帮助。

最佳答案

这是因为删除而起作用。 @@是一个纯粹的类型级构造,这意味着它没有运行时表示。

类型A @@ TAnyRef{type Tag = T; type Self = A} 类型的别名.自从Int可以安全地转换为 AnyRef (在引擎盖下,这是通过将 java.lang.Integer 转换为 java.lang.Object 来完成的),这工作得很好。

附加结构{type Tag = T; type Self = A}仅在编译时存在,因此在 JVM 进行强制转换时已完全删除。

为什么要这样做? @@的目的| (我发音为“qua”)是从旧类型创建新类型,而不会产生运行时开销。

例如,如果我们使用 case class Multiplication(value: Int) , 这让我们可以处理 Multiplication不同于 Int ,但它会创建一个实际的 Multiplication运行时的对象。

如果我们使用像 type Multiplication = Int 这样的类型别名,则没有运行时开销。但是现在MultiplicationInt 无法区分,这不是我们想要的。

类型Int @@ Multiplication阻止我们直接使用这种类型的值作为 Int , 即使它真的只是一个 Int在运行时。

关于 Scalaz `Tag.apply` : How does it work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30014387/

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