Scala中的方法级别更高类型
我刚开始在Scala中玩更高级的类型,我正在经历我不理解的行为。我在Scala 2.9.0.1上的REPL中完成了所有这些 首先,我创建了一个映射器trait,这样我就可以映射任意类型M的元素:Scala中的方法级别更高类型,scala,higher-kinded-types,Scala,Higher Kinded Types,我刚开始在Scala中玩更高级的类型,我正在经历我不理解的行为。我在Scala 2.9.0.1上的REPL中完成了所有这些 首先,我创建了一个映射器trait,这样我就可以映射任意类型M的元素: trait Mapper { def mapper[M[_], A, B](m: M[A], f: A => B): M[B] } 以下是我对映射器的实现: val mymapper = new Mapper { def mapper[List, Int, Double](m:
trait Mapper {
def mapper[M[_], A, B](m: M[A], f: A => B): M[B]
}
以下是我对映射器的实现:
val mymapper = new Mapper {
def mapper[List, Int, Double](m: List[Int], f: Int => Double): List[Double] = m.map(f)
}
但是REPL抱怨说
<console>:9: error: List does not take type parameters
def mapper[List, Int, Double](m: List[Int], f: Int => Double): List[Double] = m.map(f)
^
<console>:9: error: List does not take type parameters
def mapper[List, Int, Double](m: List[Int], f: Int => Double): List[Double] = m.map(f)
^
为什么会这样?如果Scala位于类级别,但在方法级别失败,为什么Scala可以找出M的正确类型
谢谢 此代码的含义与您认为的不同:
def mapper[List, Int, Double](m: List[Int], f: Int => Double): List[Double] = m.map(f)
List、Int和Double这里是类型参数的名称,确切的类型将由用于调用方法的值定义。是的,它们碰巧也是实际具体类型的名称,但在本例中,您正在隐藏其含义
如果使用原始名称M
、A
和B
,错误会变得更清楚:
def mapper[M, A, B](m: M[A], f: A => B): M[B] = m.map(f)
M
确实不接受类型参数
如果在“工作”示例中对参数名称执行相同的操作,则情况会变得更加明显:
举个例子,
mymapper.mapper(List(“1”、“2”、“3”),(x:String)=>x.length)
在M处于trait级别时也会起作用。因此在第一个示例中(我使用了方法级别的泛型),我的想法误入歧途,因为具体类型取决于方法的调用方。因此,我不能在实现中说m.map(),因为由调用方决定m的类型。在第二个示例中,trait的mymapper实现可以定义M[_]的具体类型,就像在类级别一样。然而,方法级别的类型A和B(我怀疑称之为Int和Double)最终仍由调用方确定。谢谢
def mapper[M, A, B](m: M[A], f: A => B): M[B] = m.map(f)
trait Mapper[M[_]] {
def mapper[A,B](m: M[A], f: A => B): M[B]
}
val mymapper = new Mapper[List] {
def mapper[A, B](m: List[A], f: A => B): List[B] = m.map(f)
}