programing

누군가 Shapeless 라이브러리가 무엇인지 설명해 줄 수 있습니까?

nasanasas 2020. 11. 5. 08:10
반응형

누군가 Shapeless 라이브러리가 무엇인지 설명해 줄 수 있습니까?


누군가 Shapeless 라이브러리가 무엇인지 간단한 용어로 설명해 줄 수 있습니까?

Scala에는 제네릭 및 상속 기능이 있으므로 Shapeless가 무엇인지 약간 혼란 스럽습니다.

상황을 명확히하는 유스 케이스가 도움이 될 것입니다.


형태가없는 것은 다양한 기능을 가지고 있기 때문에 설명하기가 조금 어렵습니다. "간단한 용어로 변수의 용도를 설명"하는 것이 더 쉬울 것입니다. 기능 개요 부터 시작하고 싶을 것 입니다.

광범위하게 말하면, 형태없는 것은 유형을 사용한 프로그래밍에 관한 것입니다. 런타임에 더 일반적으로 수행되는 작업을 컴파일 타임에 수행하고, 목록의 각 요소 유형을 정확하게 추적하고, 튜플에서 HList에서 케이스 클래스로 변환 할 수 있고, 다형성 함수를 생성합니다 (메소드와 반대). 기타

일반적인 사용 시나리오는 다음과 같습니다.

  • 어딘가에서 여러 값을 읽어 List
  • 그 형태 보증 캐스트를 수행 ListHList
  • HList값을 정규화하는 다형성 함수로 그 위에 매핑
  • 세 번째 요소 (정적으로 알려진 Int)를 0으로 채워진 문자열로 변환
  • HList의 값을 사용하여 케이스 클래스 구성

참고로는 모든 것이 고정되고 크기가 고정 HList되는 Int :: String :: Boolean :: HNil(예, 실제로 단일 유형) 과 같은 정확한 유형을 갖습니다 . 따라서 컴파일 타임에 HList에 무엇이 들어갈 지 정확히 알고 있어야하거나 형식이 안전한 캐스트가 필요합니다.

당신이 걸릴 경우 tail이러한 HList, 당신은 얻을 String :: Boolean :: HNil,이의 머리가 될 것이라고 컴파일 시간 보장 String. 헤드에 값을 추가하면 관련된 모든 유형이 유사하게 보존됩니다.

GenericShapeless 유형 클래스 와 함께 제공 되므로 튜플 및 케이스 클래스에서도 HList 작업을 사용할 수 있습니다.

내가 사용하는 다른 기능은 다음과 같습니다.

  • Coproducts, 이는 당신이 정적 "는 예로서 값을 입력 할 수 있도록 String, Double또는 Int,하지만 아무것도"(많이 좋아 Either하지만, 단지 두 가지 가능성에 국한되지 않음)

  • Lenses, 중첩 된 케이스 클래스 작업을 단순화합니다.


를 보는 HList것은 유형 작업을 시도하고 유형을 위임하거나 전환하기 전까지는 당황스러워 보일 수 있습니다. 다음을 살펴보십시오.

val myList = 1 :: 2 :: "3" :: fred :: Nil

myList여기 의 유형은 무엇입니까 ? 검사하면 유형이 List[Any]. 별로 도움이되지 않습니다. 덜 도움이되는 것은 다음 PartialFunction[Any]사용하여 map그것을 극복 하려고 시도하는 것입니다.

myList.map{
  case x: Int => x
  case x: String => Int.parseInt(x)
}

런타임에 MatchError실제로 유형 fred무엇인지 말하지 않았기 때문에 이것은 a를 던질 수 있습니다 . 유형일 수 있습니다 Fred.

을 사용하면 HList해당 목록 유형 중 하나를 캡처하지 못한 경우 컴파일 타임에 바로 알 수 있습니다. myList = 1 :: 2 :: "3" :: fred :: HNil의 세 번째 요소에 액세스 할 때 정의한 경우 유형은 다음 String과 같을 것이며 컴파일 시간에 알 수 있습니다.

@KevinWright가 말했듯이 Shapeless를 사용하는 것보다 더 많은 것이 있지만 HList라이브러리의 정의 기능 중 하나입니다.


Shapeless의 모든 것에는 두 가지 공통점이 있습니다.

첫째, Scala 표준 라이브러리에는 없지만 틀림없이 있어야합니다. 따라서 Shapeless가 무엇인지 묻는 것은 Scala 표준 라이브러리에서 묻는 것과 비슷합니다! 그것은의 모든 것을 . 그랩 백입니다.

(그러나 다음과 같은 이유 때문에 완전히 임의의 가방이 아닙니다.)

둘째, Shapeless의 모든 것은 컴파일 타임에 향상된 검사와 안전성 제공합니다 . Shapeless (내가 생각할 수있는 것)의 어떤 것도 실제로 런타임에 아무것도 "하지"않습니다. 모든 흥미로운 작업은 코드가 컴파일 될 때 발생합니다. 목표는 항상 코드가 컴파일되면 런타임에 충돌하거나 잘못된 작업을 수행하지 않을 것이라는 확신을 높이는 것입니다. (따라서이 주목할만한 quip : https://twitter.com/mergeconflict/status/304090286659866624 )

https://stackoverflow.com/a/4443972/86485 에서 추가 리소스에 대한 링크와 함께 유형 수준 프로그래밍이 무엇인지에 대한 멋진 소개가 있습니다 .

참고 URL : https://stackoverflow.com/questions/21739190/can-someone-explain-to-me-what-the-shapeless-library-is-for

반응형