Scala Language
유형 수준 프로그래밍
수색…
유형 수준 프로그래밍 소개
목록의 요소가 다양하지만 알려진 유형이있는 이질적인 목록을 고려할 경우 요소의 유형 정보를 삭제하지 않고 목록의 요소에 대해 작업을 집합 적으로 수행 할 수있는 것이 바람직 할 수 있습니다. 다음 예제는 단순한 이질적인 목록을 통해 매핑 작업을 구현합니다.
요소의 형태가 변화하기 때문에, 우리가 수행 할 수있는 작업의 클래스 형 돌출부의 특정 형태로 제한하고 있으므로가 형질 정의되는 Projection
추상 갖는 type Apply[A]
돌기의 결과 유형을 계산하고, def apply[A](a: A): Apply[A]
투영의 결과 값 을 계산하는 def apply[A](a: A): Apply[A]
합니다.
trait Projection {
type Apply[A] // <: Any
def apply[A](a: A): Apply[A]
}
type Apply[A]
구현할 때 우리는 (값 수준과 대비하여) 유형 수준에서 프로그래밍하고 있습니다.
우리의 이기종 목록 유형은 투영의 유형뿐만 아니라 원하는 투영으로 매개 변수화 된 map
작업을 정의합니다. 지도 연산의 결과는 추상 클래스이고, 클래스와 프로젝션을 구현하면 달라지며 자연스럽게 HList
.
sealed trait HList {
type Map[P <: Projection] <: HList
def map[P <: Projection](p: P): Map[P]
}
비어있는 이종리스트 인 HNil
의 경우, 어떤 투영의 결과는 항상 그 자체 일 것입니다. 여기에서 우리는 선언 trait HNil
우리가 쓸 수 있도록 편의를 HNil
대신의 유형으로 HNil.type
:
sealed trait HNil extends HList
case object HNil extends HNil {
type Map[P <: Projection] = HNil
def map[P <: Projection](p: P): Map[P] = HNil
}
HCons
는 비어 있지 않은 이기종 목록입니다. 여기에서지도 연산을 적용 할 때 결과 헤드 유형은 헤드 값 ( P#Apply[H]
)에 투영법을 적용한 결과이며 결과 꼬리 유형은 HList
알려진 꼬리 ( T#Map[P]
)에 대한 HList
:
case class HCons[H, T <: HList](head: H, tail: T) extends HList {
type Map[P <: Projection] = HCons[P#Apply[H], T#Map[P]]
def map[P <: Projection](p: P): Map[P] = HCons(p.apply(head), tail.map(p))
}
가장 명백한 프로젝션은 몇 가지 형태의 래핑 연산을 수행하는 것입니다. 다음 예제는 HCons[Option[String], HCons[Option[Int], HNil]]
의 인스턴스를 생성합니다.
HCons("1", HCons(2, HNil)).map(new Projection {
type Apply[A] = Option[A]
def apply[A](a: A): Apply[A] = Some(a)
})