2014-11-24 4 views
1

typeclass (아마도 특성)와 같은 것을 정의한 다음 나중에 원래 형식 정의를 수정하지 않고 특정 형식에 대한 해당 형식 라이브러리의 인스턴스를 정의 할 수 있습니까?하스켈의 스칼라 입력 도구를 어떻게 에뮬레이트 할 수 있습니까?

예를 들어, class User extends Printable 말을하지 않고, 어떻게 든 클래스 정의에서 별도로 User 클래스 Printable를 만들 수 다음 코드

class User { 
} 

trait Printable { 
    def print(): String 
} 

을 가지고?

+0

예. typeclass 패턴이라는 것이 있습니다. 동작은 정확히 동일하지 않습니다. 여러 가지 구현이있을 수 있으며 구현을 작동 범위로 가져와야합니다. 그러나 원칙적으로 존재하는 예는 있습니다. – Cubic

+0

@ 큐빅 답안을 어떻게 보여줄 수 있습니까? –

+1

[유형 클래스를 객체 및 Implicits로] (http://infoscience.epfl.ch/record/150280/files/TypeClasses.pdf)는 스칼라에서 유형 클래스를 구현 한 훌륭한 문서입니다. –

답변

3

예를 들어 정의하려는 typeclass에 대한 특성을 생성합니다.

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)) 
} 

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

는 당신은 당신이 원하는 유형이 특성의 암시 적 인스턴스를 정의 할 수 있습니다

그러면 인스턴스 구현을 가져 와서 writePrintable으로 전화 할 수 있습니다.

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

새로운 유형의 컴패니언 개체 (예 :'Printable')에 암시 적 인스턴스를 정의 할 수 있으며이 경우 명시 적으로 가져올 필요가 없습니다. – lmm

+0

Haskell에서와 마찬가지로 가능한 한 항상 고아 인스턴스를 피할 수있는 좋은 이유가 있습니다. –

관련 문제