如何在Scala中模拟Haskell的类型类?

时间:2014-11-24 21:59:43

标签: scala haskell types typeclass

有没有办法定义像类型类(可能是特征?)之类的东西,然后在不修改原始类型定义的情况下为特定类型定义该类型类的实例?

例如,拥有以下代码

class User {
}

trait Printable {
  def print(): String
}

我可以以某种方式将UserPrintable与类定义分开,而不必说class User extends Printable吗?

1 个答案:

答案 0 :(得分:3)

您可以为要定义的类型类创建特征,例如

trait Printable[T] {
   def print(p: T): String
}

然后您可以为所需的类型定义此特征的隐式实例:

object Instances {
    implicit val UserPrintable = new Printable[User] {
        def print(u: User) = u.name
    }
}

在任何需要类型类的函数中,您可以为实例添加隐式参数:

def writePrintable[T](p: T)(implicit pclass: Printable[T]) {
    println(pclass.print(p))
}

然后你可以通过导入实例实现来调用writePrintable,例如。

import Instances._
writePrintable(new User("user name"))