Scala类型不匹配:Nothing =>没有?

时间:2016-08-18 22:03:52

标签: scala

第一个stackoverflow问题和Scala的新功能。我试着用这个例子来理解多态类型,我写道:

def identFun[A](a: A): A = a

def testerChar(l: List[Char], f: Char => Char): List[Char] = {
  val li = l.map((r: Char) => f(r: Char))
  li
}

哪个工作正常(如果不是有点冗长):

scala> testerChar(List('a','b','c'), identFun)
res49: List[Char] = List(a, b, c)

然而:

def testerA[A](l: List[A], f: A => A): List[A] = {
  val li = l.map((r: A) => f(r: A))
  li
}

收率:

scala> testerA(List('a','b','c'), identFun)
<console>:14: error: type mismatch;
 found   : Nothing => Nothing
 required: Char => Char
       testerA(List('a','b','c'), identFun)

我错过了哪些可以让&#34; testerA&#34;返回传递给它的任何类型的身份?

谢谢!

尝试:

def testerA[A](l: List[A])( f: A => A): List[A] = {
  val li = l.map((r: A) => f(r: A))
  li
}

GOT:

scala> testerA(List('a','b','c'), identFun)
<console>:14: error: too many arguments for method testerA: (l: List[A])(f: A => A)List[A]
   testerA(List('a','b','c'), identFun)

3 个答案:

答案 0 :(得分:1)

事实证明,如果你简化了事情,你也可以得到你所追求的东西。

scala> def identFun[A](a: A): A = a
identFun: [A](a: A)A

scala> def testerA[A](l: List[A])(f: A => A): List[A] = l.map(f)
testerA: [A](l: List[A])(f: A => A)List[A]

scala> testerA(List('a','b','c'))(identFun)
res5: List[Char] = List(a, b, c)

答案 1 :(得分:1)

其他答案解释了如何解决问题,而不是问题本身。问题是当你在没有指定类型参数的情况下编写testerA(List('a','b','c'), identFun)时,Scala不能使用第一个参数来推断A,然后使用A来确定类型第二个论点。

相反,它首先检查两个参数。同样,它需要推断List.applyidentFun的类型参数。在第一种情况下,它选择Char(当然),但在第二种情况下,它选择Nothing。在此之后,它试图最终决定A,但当然这些论点现在并不兼容。

使用def testerA[A](l: List[A])(f: A => A),使用第一个参数推断出A,然后用于检查f

答案 2 :(得分:0)

对我来说,这样称之为:

class User < ApplicationRecord
  has_many :posts, dependent: :destroy
  has_many :contacts, dependent: :destroy

class Contact < ApplicationRecord
  belongs_to :user

class Post < ApplicationRecord
  belongs_to :user

我怀疑testerA的类型A与identFun的类型A不同。我不确定如何使它自动解析为char。