Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的方法级别更高类型_Scala_Higher Kinded Types - Fatal编程技术网

Scala中的方法级别更高类型

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:

我刚开始在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: 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)
}