【问题标题】:how to get scala higher-kinded type to work如何让 scala 更高级的类型工作
【发布时间】:2015-03-12 02:56:38
【问题描述】:

我正在努力提高我对 Scala 中高级类型的理解。当我回到基础时,我陷入了以下困境:

 def fooList[A <: Int](x: List[A]): List[A] = x.map{ e => e + 1 }

Scala 编译器不接受它,我不明白。 “A”必须是 Int 的子类。因此,应在此处传递的 Int 下的任何类型都应该有效。它为什么抱怨?有人可以在这里给我建议吗?

M

【问题讨论】:

  • 这与更高种类的类型有什么关系?

标签: scala higher-kinded-types


【解决方案1】:

A 在这种情况下确实必须是Int,因为您不能创建Int 的子类,但编译器似乎不想证明这一点。除此之外,由于A &lt;: IntInt+ 方法返回一个Int

所以e + 1Int 而不是A(即使A 必须是Int,无论如何)。因此,x.map(e =&gt; e + 1) 返回 List[Int] 而不是 List[A]。为了返回 List[A],你需要一些 A 类和 + 方法,它也返回 A,而你没有。

【讨论】:

  • 嗯,如果我理解你的话,我是不是把编译时类型强制与运行时类型强制混淆了?听起来还是很奇怪。
  • 除了错误转换引发的异常之外,没有运行时类型强制,但这不适用于此处。简单地说,如果AInt 的子类,则A 加上IntInt,而不是A——仅仅是因为@ 上的+ 的类型签名987654347@.
  • 是的,我只是说我想我理解你。我的困惑来自这样一个事实,即当我们在这里编译时我正在考虑多态性,但这不起作用。如果您有一个 A > B 的类 A 和 B,则在签名中返回 A 的方法可以返回 B 实例。
  • 为了迂腐,A 必须是Int 是不正确的。仅仅因为你不能创建Int 的子类并不意味着你不能想出Int子类型。例如,定义 val a: Int = 42 你可以有单例类型 a.type 这是Int 的子类型。
猜你喜欢
  • 2013-05-24
  • 2023-03-30
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 2015-03-08
  • 1970-01-01
  • 2021-02-02
相关资源
最近更新 更多