수색…


유형 수준 프로그래밍 소개

목록의 요소가 다양하지만 알려진 유형이있는 이질적인 목록을 고려할 경우 요소의 유형 정보를 삭제하지 않고 목록의 요소에 대해 작업을 집합 적으로 수행 할 수있는 것이 바람직 할 수 있습니다. 다음 예제는 단순한 이질적인 목록을 통해 매핑 작업을 구현합니다.

요소의 형태가 변화하기 때문에, 우리가 수행 할 수있는 작업의 클래스 형 돌출부의 특정 형태로 제한하고 있으므로가 형질 정의되는 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)
})


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow