代码之家  ›  专栏  ›  技术社区  ›  Gonzalo Guglielmo

scala中特殊多态性与参数多态性的差异

  •  3
  • Gonzalo Guglielmo  · 技术社区  · 6 年前

    所以,我一直在寻找关于 parametric polymorphism adhoc-polymorphism 但是我还是有些怀疑。

    例如,方法 head 在集合中,显然是参数多态性,因为用于获取列表[int]中头部的代码与任何其他列表中的代码相同。

    List[T] {
        def head: T = this match {
            case x :: xs => x
            case Nil => throw new RuntimeException("Head of empty List.") 
        }
    }
    

    (不确定这是否是head的实际实现,但并不重要)

    另一方面,类型类被认为是临时多态性。因为我们可以提供不同的实现,绑定到类型。

    trait Expression[T] {
        def evaluate(expr: T): Int
    }
    
    object ExpressionEvaluator {
      def evaluate[T: Expression](value: T): Int = implicitly[Expression[T]].evaluate(value)
    }
    
    implicit val intExpression: Expression[Int] = new Expression[Int] {
      override def evaluate(expr: Int): Int = expr
    }
    
    ExpressionEvaluator.evaluate(5)
    // 5
    

    在中间,我们有类似于filter的方法,这些方法是参数化的,但是我们可以通过提供不同的函数来提供不同的实现。

    List(1,2,3).filter(_ % 2 == 0)
    // List(2)
    

    过滤、映射等方法是否被视为特殊多态性?为什么或为什么不呢?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Andrey Tyukin    6 年前

    filter List

    def filter(p: (A) ⇒ Boolean): List[A] 
    

    A

    map

    final def map[B, That]
      (f: (A) ⇒ B)
      (implicit bf: CanBuildFrom[List[A], B, That])
    : That  
    

    B CanBuildFrom[List[String], Int, BitSet]

    implicit def ahComeOnGiveUpAndJustBuildAList[A, B]
    : CanBuildFrom[List[A], B, List[B]]
    

    CanBuildFrom[List[A], B, That] CanBuildFrom[List[A], B, List[B]]