第一个堆栈溢出问题,是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)我遗漏了什么来允许"testerA“返回传递给它的任何类型的标识?
谢谢!
已尝试:
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: too many arguments for method testerA: (l: List[A])(f: A => A)List[A]
testerA(List('a','b','c'), identFun)发布于 2016-08-19 07:55:14
事实证明,如果你简化了事情,你也可以得到你想要的东西。
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)发布于 2016-08-19 14:48:55
其他答案解释了如何解决问题,但不是问题本身。问题是,当您编写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的类型。
发布于 2016-08-19 07:24:24
对我来说,这样称呼它很管用:
testerA(List('a','b','c'), identFun[Char])我怀疑testerA的类型A与identFun的类型A不同。我不确定如何让它自动解析为char。
https://stackoverflow.com/questions/39028194
复制相似问题