스칼라에서 'type'키워드의 기능 이해
나는 스칼라를 처음 접했고 type
키워드 에 대해 많이 찾을 수 없었습니다 . 다음 표현의 의미를 이해하려고합니다.
type FunctorType = (LocalDate, HolidayCalendar, Int, Boolean) => LocalDate
FunctorType
일종의 별칭이지만 무엇을 의미합니까?
예, 타입 별칭 FunctorType
은 속기입니다.
(LocalDate, HolidayCalendar, Int, Boolean) => LocalDate
타입 별칭은 종종 코드의 나머지 부분을 단순하게 유지하는 데 사용됩니다.
def doSomeThing(f: FunctorType)
컴파일러는 다음과 같이 해석합니다.
def doSomeThing(f: (LocalDate, HolidayCalendar, Int, Boolean) => LocalDate)
예를 들어 다른 유형에 정의 된 튜플 또는 함수 인 많은 사용자 정의 유형을 정의하지 않아도됩니다.
몇 가지 흥미로운 사용 사례가있다 type
, 예를 들어 설명한 바와 같이, 이 장 의 스칼라 프로그래밍 .
실제로 type
Scala 의 키워드는 복잡한 유형을 더 짧은 이름으로 별칭 지정하는 것 이상을 수행 할 수 있습니다. 형식 멤버를 소개 합니다 .
아시다시피 클래스에는 필드 멤버와 메서드 멤버가있을 수 있습니다. 스칼라는 클래스에 타입 멤버를 가질 수도 있습니다.
특별한 경우에는 type
더 간결한 코드를 작성할 수있는 별명을 도입하는 것입니다. 타입 시스템은 타입 검사가 수행 될 때 별칭을 실제 타입으로 대체합니다.
그러나 당신은 또한 이와 같은 것을 가질 수 있습니다
trait Base {
type T
def method: T
}
class Implementation extends Base {
type T = Int
def method: T = 42
}
클래스의 다른 멤버와 마찬가지로 형식 멤버도 추상적 일 수 있으며 (실제로 값을 지정하지 않아도 됨) 구현에서 재정의 될 수 있습니다.
제네릭으로 구현할 수있는 많은 것들이 추상적 인 타입의 멤버로 변환 될 수 있기 때문에 타입 멤버는 제네릭의 이중으로 볼 수 있습니다.
따라서 예를 들어 앨리어싱에 사용할 수 있지만 스칼라 유형 시스템의 강력한 기능이기 때문에 이것으로 제한하지 마십시오.
자세한 내용은이 훌륭한 답변을 참조하십시오.
별명으로 "type"을 사용하는 방법을 보여주는 예제 :
type Action = () => Unit
위의 정의는 Action을 빈 매개 변수 목록을 가져와 Unit을 반환하는 프로 시저 (메소드) 유형의 별칭으로 정의합니다.
Roland Ewald 의 답변은 별명 유형 별칭의 매우 간단한 유스 케이스로 설명했기 때문에 더 좋았습니다. 자세한 내용은 매우 훌륭한 자습서를 소개했습니다. 그러나이 게시물에 type members 라는 또 다른 유스 케이스가 도입 되었으므로 가장 실용적인 유스 케이스를 언급하고 싶습니다.이 부분은 매우 좋아했습니다. (이 부분은 여기 에서 가져 왔습니다 :)
추상 유형 :
type T
위에서 T는 사용될 유형이 아직 알려지지 않았으며 구체적인 서브 클래스에 따라 정의 될 것이라고 말합니다. 프로그래밍 개념을 항상 이해하는 가장 좋은 방법은 예를 제공하는 것입니다. 다음 시나리오가 있다고 가정합니다.
Cow 및 Tiger 클래스의 eat 메소드는 매개 변수 유형이 다르기 때문에 Animal 클래스의 eat 메소드를 대체하지 않기 때문에 컴파일 오류가 발생합니다. Cow 클래스의 Grass, Tiger 클래스의 Meat vs. Animal 클래스의 Super 클래스 및 모든 하위 클래스가 일치해야합니다.
이제 다음 다이어그램을 통해 유형 추상화로 돌아가서 단순히 유형 추상화를 추가하여 서브 클래스 자체에 따라 입력 유형을 정의 할 수 있습니다.
이제 다음 코드를 살펴보십시오.
val cow1: Cow = new Cow
val cow2: Cow = new Cow
cow1 eat new cow1.SuitableFood
cow2 eat new cow1.SuitableFood
val tiger: Tiger = new Tiger
cow1 eat new tiger.SuitableFood // Compiler error
Compiler is happy and we improve our design. We can feed our cow with cow.SuitableFood and compiler prevent us with feeding out cow with the food which is suitable for Tiger. But what if we want to make difference between the type of cow1 SuitableFood and cow2 SuitabeFood. In another word, it would be very handy in some scenarios if the path by which we reach to the type (of course via object) does basically matter. Thanks to the advanced features in scala, it is possible:
Path-dependent types: Scala objects can have types as members. The meaning of the type, depends on the path you use to access it. The path is determined by the reference to an object (aka an instance of a class). In order to implement this scenario, you need to define class Grass inside the Cow, i.e., Cow is the outer class and Grass is the inner class. The structure will be like this:
class Cow extends Animal {
class Grass extends Food
type SuitableFood = Grass
override def eat(food: this.SuitableFood): Unit = {}
}
class Tiger extends Animal {
class Meat extends Food
type SuitableFood = Meat
override def eat(food: this.SuitableFood): Unit = {}
}
Now if you try to compile this code:
1. val cow1: Cow = new Cow
2. val cow2: Cow = new Cow
3. cow1 eat new cow1.SuitableFood
4. cow2 eat new cow1.SuitableFood // compilation error
On line 4 you will see an error because Grass is now an inner class of Cow, therefore, to create an instance of Grass, we need a cow object and this cow object determines the path. So 2 cow objects give rise to 2 different path. In this scenario, cow2 only wants to eat food especially created for it. So:
cow2 eat new cow2.SuitableFood
Now everybody is happy :-)
참고 URL : https://stackoverflow.com/questions/19492542/understanding-what-type-keyword-does-in-scala
'IT story' 카테고리의 다른 글
숫자가 범위 내에 있는지 우아하게 확인하는 방법은 무엇입니까? (0) | 2020.06.23 |
---|---|
Python datetime-strptime을 사용하여 일, 월, 년을 얻은 후 고정 시간과 분 설정 (0) | 2020.06.22 |
Vue 2-Vue-warn 뮤팅 소품 (0) | 2020.06.22 |
Objective-C에 강력한 형식의 컬렉션이 있습니까? (0) | 2020.06.22 |
Azure 웹 사이트에 게시 한 후 파일 또는 어셈블리 System.Web.Http.WebHost를로드 할 수 없습니다. (0) | 2020.06.22 |