누군가 Shapeless 라이브러리가 무엇인지 설명해 줄 수 있습니까?
누군가 Shapeless 라이브러리가 무엇인지 간단한 용어로 설명해 줄 수 있습니까?
Scala에는 제네릭 및 상속 기능이 있으므로 Shapeless가 무엇인지 약간 혼란 스럽습니다.
상황을 명확히하는 유스 케이스가 도움이 될 것입니다.
형태가없는 것은 다양한 기능을 가지고 있기 때문에 설명하기가 조금 어렵습니다. "간단한 용어로 변수의 용도를 설명"하는 것이 더 쉬울 것입니다. 기능 개요 부터 시작하고 싶을 것 입니다.
광범위하게 말하면, 형태없는 것은 유형을 사용한 프로그래밍에 관한 것입니다. 런타임에 더 일반적으로 수행되는 작업을 컴파일 타임에 수행하고, 목록의 각 요소 유형을 정확하게 추적하고, 튜플에서 HList에서 케이스 클래스로 변환 할 수 있고, 다형성 함수를 생성합니다 (메소드와 반대). 기타
일반적인 사용 시나리오는 다음과 같습니다.
- 어딘가에서 여러 값을 읽어
List
- 그 형태 보증 캐스트를 수행
List
로HList
HList
값을 정규화하는 다형성 함수로 그 위에 매핑- 세 번째 요소 (정적으로 알려진
Int
)를 0으로 채워진 문자열로 변환 - HList의 값을 사용하여 케이스 클래스 구성
참고로는 모든 것이 고정되고 크기가 고정 HList
되는 Int :: String :: Boolean :: HNil
(예, 실제로 는 단일 유형) 과 같은 정확한 유형을 갖습니다 . 따라서 컴파일 타임에 HList에 무엇이 들어갈 지 정확히 알고 있어야하거나 형식이 안전한 캐스트가 필요합니다.
당신이 걸릴 경우 tail
이러한 HList, 당신은 얻을 String :: Boolean :: HNil
,이의 머리가 될 것이라고 컴파일 시간 보장 String
. 헤드에 값을 추가하면 관련된 모든 유형이 유사하게 보존됩니다.
Generic
Shapeless 는 유형 클래스 와 함께 제공 되므로 튜플 및 케이스 클래스에서도 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 에서 추가 리소스에 대한 링크와 함께 유형 수준 프로그래밍이 무엇인지에 대한 멋진 소개가 있습니다 .
'programing' 카테고리의 다른 글
iOS 7에서 내비게이션 바의 높이는 얼마입니까? (0) | 2020.11.05 |
---|---|
nullable 값이있는 구조체의 HashSet이 엄청나게 느린 이유는 무엇입니까? (0) | 2020.11.05 |
Firebase JobDispatcher-이전 API (JobScheduler 및 GcmTaskService)와 비교하여 어떻게 작동합니까? (0) | 2020.11.05 |
typescript에서 npm 모듈을 사용하는 방법은 무엇입니까? (0) | 2020.11.05 |
무료 C # QR 코드 생성기 (0) | 2020.11.05 |