как тайп астронавт мог бы иногда показывать, чего полезного в вашей астронавтике есть. а то вы все больше в стиле "в космос летал, но Бога не видел"
Из менее метапрограммичного, ещё дико радуют абстрактные типы в скале/associated типы в расте/type families в хаскеле. (Да, они разные по сути, но использовать можно в похожем ключе, кстати и с ML модулями так можно проектировать)
Общая идея в том, что ты можешь к тайпклассу/трейту/интерфейсу прекрепить какой-то набор типов, которые будут определять те, кто его реализуют:
Достаточно условный пример, но суть пояснит:
trait Graph {
type Node
type Edge
def createNode(id: Int): Node
def createEdge(from: Node, weight: Double, to: Node): Edge
def getDistance(source: Node, destination: Node): Double
}
final class MyGraph {
type Node = Int
type Edge = MyEdge
...
}
Надо обратить внимание ещё на то, что в скале эти типы могут зависеть от конкретного инстанса трейта и через них как раз можно эмулировать зависимые типы.
На практике я такое использую, когда хочется либо скрыть какие-то внутренние типы от потребителей, либо когда имеет смылс ради оптимизации у конкретной реализации использовать другой тип.