我如何模仿Haskell';Scala中的类型类是什么?

我如何模仿Haskell';Scala中的类型类是什么?,scala,haskell,types,typeclass,Scala,Haskell,Types,Typeclass,有没有一种方法可以定义类似于typeclass(可能是一个trait?)的东西,然后在不修改原始类型定义的情况下为特定类型定义该typeclass的实例 例如,具有以下代码 class User { } trait Printable { def print(): String } 我是否可以将用户类可打印与类定义分开,而不必说类用户扩展可打印?为要定义的类型类创建特征,例如 trait Printable[T] { def print(p: T): String } 然后,您可

有没有一种方法可以定义类似于typeclass(可能是一个trait?)的东西,然后在不修改原始类型定义的情况下为特定类型定义该typeclass的实例

例如,具有以下代码

class User {
}

trait Printable {
  def print(): String
}

我是否可以将
用户
类可打印与类定义分开,而不必说
类用户扩展可打印

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

trait Printable[T] {
   def print(p: T): String
}
然后,您可以为所需类型定义此特征的隐式实例:

object Instances {
    implicit val UserPrintable = new Printable[User] {
        def print(u: User) = u.name
    }
}
在任何需要typeclass的函数中,可以为实例添加隐式参数:

def writePrintable[T](p: T)(implicit pclass: Printable[T]) {
    println(pclass.print(p))
}
然后,您可以通过导入实例实现来调用
writePrintable

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

对有一种叫做类型类模式的东西。行为并不完全相同-可能有多个实现,您必须将这些实现纳入范围以使其工作-但原则上,是的,这是存在的。@Cubic您能在回答中说明如何实现吗?这是一篇关于Scala中类型类实现的优秀论文。请注意,您可以在新类型的伴随对象中定义隐式实例(例如,
Printable
),在这种情况下,无需显式导入它们。也有很好的理由尽可能避免孤立实例,就像在Haskell中一样。