Это очень крутая идея, но, к сожалению, ее истинный потенциал не может быть реализован в системе типов Scala. Что вам действительно нужно, так это зависимые типы , которые позволяют наложить на вызывающего метода вашего метода обязательное подтверждение того, что аргумент находится в диапазоне, так что метод даже не может быть вызван с неверным аргументом.
Но без зависимых типов и возможности проверки спецификаций во время компиляции, я думаю, это имеет сомнительную ценность, даже если оставить в стороне соображения производительности. Подумайте, как это лучше, чем использовать функцию require
для определения начальных условий, требуемых вашим методом, например:
def foo(i:Int) = {
require (i >= 0)
i * 9 + 4
}
В обоих случаях отрицательное значение вызовет исключение во время выполнения, либо в функции require
, либо при создании вашего NonNegativeDouble
. Оба метода четко определяют контракт метода, но я бы сказал, что создание всех этих специализированных типов требует больших затрат, единственная цель которых заключается в инкапсуляции конкретного выражения, которое должно быть утверждено во время выполнения. Например, что, если вы хотите применить немного другое предварительное условие; говорите, что i > 45
? Будете ли вы создавать IntGreaterThan45
тип только для этого метода?
Единственный аргумент, который я вижу для построения, например. тип NonNegativeFoo
- это если у вас много методов, которые используют и возвращают только положительные числа. Даже тогда, я думаю, что выплата сомнительна.
Кстати, это похоже на вопрос Как далеко зайти со строго типизированным языком? , на который я дал аналогичный ответ.