Как ограничить тип подмножеством другого? - PullRequest
2 голосов
/ 11 февраля 2011

У меня есть это глупый вопрос чувство, но здесь идет ... Могу ли я определить тип, который является подмножеством элементов другого типа?Вот упрощенный пример.

scala> class Even(i: Int) {
     | assert(i % 2 == 0)  
     | }
defined class Even

scala> new Even(3)
java.lang.AssertionError: assertion failed

Это проверка во время выполнения.Могу ли я определить тип так, чтобы это проверялось при компиляции?То есть входной параметр i доказуемо всегда четен?

1 Ответ

7 голосов
/ 11 февраля 2011

Это может делать типозависимая типизация в таких языках, как Coq и Agda, но не в Scala.

В зависимости от конкретного варианта использования существуют способы кодирования чисел peano в системе типов, которые могут, однако, вам помочь.

Возможно, вы захотите попробовать определить и Even, и Odd вместе с некоторым запечатанным абстрактным супертипом (возможно, OddOrEven) и фабричным методом, который возвращает правильный экземпляр из любого заданного целого числа.

Другая возможность - определить Even как экстрактор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...