논리적 장치 타입 `LogicalDevice`가 있다.
`LogicalDevice`의 서브 타입으로 `CPU`와 `GPU`, `NPU`가 있다.
`PhysicalDevice`는 여러 종류, 여러 타입의 `LogicalDevice`를 가질 수 있다.
`PhysicalDevice`는 `LogicalDevice` 반환하는 메서드 `getLogicalDevices()`를 가진다.
`PhysicalDevice`를 구현 하는 타입은 `Mobile`, `PC`, `SuperComputer`가 있다.
`Mobile`는 `CPU`와 `NPU` 가지고 있고, `PC`는 `CPU`와 `GPU`를 하니씩 가지고 있고, `SuperComputer`는 `CPU`와 `GPU`를 여러개 가지고 있다.
각 `PhysicalDevice`의 구현은 `LogicalDevice`를 반환하는 메서드를 구현해야한다.
이 메서드는 컴파일 시점에 반환 할 수 있는 `LogicalDevice`의 서브 타입을 알 수 있어야 한다.
예를 들어, 다음과 같은 자바 코드는 반환할 수 있는 `LogicalDevice`의 타입을 알 수 없다.
```java
public class Mobile implements PhysicalDevice {
@Override
public List<LogicalDevice> getLogicalDevices() {
return Arrays.asList(new CPU(), new NPU());
}
}
```
자바는 안되지? selad permit interface랑 final class로 해보려고 하는데 잘안되네.
대충 읽긴 했는데 c++ 어떻게 잘 하면 되지 않을까 - dc App
enum 써라
그냥 sum type 흉내낼 수 있는 언어면 되지 싶은데
아 문제를 잘못 읽었노 좀 더 생각해버야겠네
생각하기 커찮은데 저히 row typing 써요
러스트로 구현하면 getLogicalDevices 리턴타입 어떻게 되냐?
Associate type에 enum 반환하면 될 듯
그러면 논리장치 서브셋마다 enum을 만드는건가? list로 반환해야 하는 제한 없으면 그냥 튜플로 묶어도 될듯
그치 섭셋 이넘은 장치마다 만들어야 match에서 딱 힐요한 경우만 핸들링 할 수 있으니까…아마도..
이 요구사항을 만족할 수 있는 언어는 다음과 같다. Rust - 제네릭 + 트레이트 조합으로 컴파일 타임에 타입을 고정 가능 TypeScript - 제네릭 + 유니언 타입을 사용하여 반환 가능한 타입을 한정 가능 C++ - 템플릿 + std::variant 활용으로 반환 타입을 컴파일 타임에 결정 가능 Haskell - GADT(Generalized Algebraic Data Types) 또는 타입 클래스(Type Class) 활용 가능 Scala - Sealed trait + case class 조합으로 컴파일 타임에 반환 타입 결정 가능 Swift - protocol + associatedtype 또는 enum으로 타입 고정 가능 Zig - comptime 키워드를 사용하여 컴파일 시점에 반환 타입을
F# – Discriminated Union(차별화된 유니온 타입)과 패턴 매칭을 활용하여 컴파일 시점에 반환 타입 결정 가능 Kotlin – sealed interface + when 표현식을 활용하여 반환 타입을 제한 가능 Ada – 강력한 정적 타입 시스템과 제네릭을 활용하여 반환 가능한 타입을 한정 가능 OCaml – Variant 타입과 모듈 시스템을 활용하여 컴파일 타임 타입 결정 가능 Julia – 매크로와 다중 디스패치를 활용하여 반환 타입을 정적으로 결정 가능 Elm – Strict 타입 시스템과 유니언 타입을 활용하여 컴파일 시점에 타입을 고정 가능 Vala – GObject 기반의 강한 정적 타입 시스템을 활용하여 반환 타입을 제한 가능 Crystal – 유니온 타입과 제네릭을 활용하여
Crystal – 유니온 타입과 제네릭을 활용하여 컴파일 시점에 반환 타입을 고정 가능 Nim – 강한 정적 타입 시스템과 제네릭을 활용하여 제한된 타입 반환 가능
자바는 안된다고? - dc App
자바의 제네릭은 런타임에 타입 정보가 사라지므로, List와 같은 구조에서 T가 정확히 어떤 타입인지 컴파일 타임에 알 수 없다. 자바에서는 List를 반환할 때 LogicalDevice의 하위 타입이 무엇인지 런타임까지 확정할 수 없다.
https://chatgpt.com/share/67a9d6cb-0010-8006-a5ce-f146df51938c
아... 컴파일 타임에 알 수 있는게 조건이었구나 - dc App
ocaml은 gadt쓰면 됨
파이썬 타입힌트로도 가능 ㅇㅇ
델파이 - dc App