Scala 理解类型参数

Scala 理解类型参数,scala,Scala,查看IO Monad的部分签名: 据我所知,IO[+A]意味着IO类型接受A或其子类的类型参数 查看def map[B]…,B是此函数中涉及的一种类型。使用map[B]f:A=>B:IO[B]很有用,因为据我所知,您可以将B列为f的返回类型,以及IO的返回类型参数 因此,以下实现将导致编译时问题: mapf:Int=>String:IO[Int]So+A的意思与T类似,我不确定您在这个上下文中所说的实现是什么意思:mapf:Int=>String:IO[Int]。如果您的意思是调用传递函数Int

查看IO Monad的部分签名:

据我所知,IO[+A]意味着IO类型接受A或其子类的类型参数

查看def map[B]…,B是此函数中涉及的一种类型。使用map[B]f:A=>B:IO[B]很有用,因为据我所知,您可以将B列为f的返回类型,以及IO的返回类型参数

因此,以下实现将导致编译时问题:


mapf:Int=>String:IO[Int]

So+A的意思与T类似,我不确定您在这个上下文中所说的实现是什么意思:mapf:Int=>String:IO[Int]。如果您的意思是调用传递函数Int=>String的map,则返回IO[String]——被调用方无法决定返回的类型


如果您的意思是覆盖map的实现,而这不应该使用override def mapf:Int=>String:IO[String]执行,那么这并不是覆盖任何内容,因为在覆盖时不能删除类型参数,也不能更改它接收的参数的类型,并且可以将返回类型更改为子类型,而不是IO[String]不是IO[B]的子类型所以这也是不同的。

对不起,问题是什么?;基本上我在上面的例子中寻找确认/更多细节,请:我希望我回答了你的问题。我认为这是一个很好的问题,但措辞不容易。@KevinMeredith你对Scala类型的差异很好奇吗?看看这个问答:谢谢@wheaties。我已经读过这个po这是雷克斯·克尔写的一篇可靠的文章。每次读到这篇文章和复习像上面这样的问题,我都会学到更多
trait IO[+A] { self =>
  def run: A
  def map[B](f: A => B): IO[B] =
    new IO[B] { def run = f(self.run) }