第一个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)
答案 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.apply
和identFun
的类型参数。在第一种情况下,它选择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。