o /
Это может быть довольно интересный вопрос, который может вызвать у вас творческий подход.
Я хочу смоделировать валюты таким образом, чтобы я мог:
- сопоставление с образцом по типу (=> алгебра c тип данных)
- сохранение числового значения c в нем
- использование уточненного типа для ограничения значения, например, положительными значениями, например,
val amount: Float Refined Positive
- имеет трехзначный код валюты, такой как "USD", который является предопределенным и неизменным
Выполнение подмножества этого в одной реализации это просто, но я обнаружил, что на удивление трудно создать тип, который допускает что-то вроде следующего:
def doSomething(currency: Currency): Unit {
currency match {
case BITCOIN => println("Oh, a cryptocurrency! And it is ${currency.amount} ${currency.code}!"
case EURO => println("So we are from Europe, eh?")
}
}
doSomething(new Currency.BITCOIN(123f)) // yielding "Oh, a cryptocurrency! And it is 123 BTC!"
val euro = new Currency.EURO(-42f) // compile error
Надеюсь, я четко изложил свои намерения. Если есть библиотека, которая делает это, я рад, что на нее указывают, хотя я надеюсь кое-что узнать, подумав об этом сам.