2015-01-05 1 views
1

На данный момент у меня есть куча функций, которые проверяют, соответствуют ли строки определенным обстоятельствам, например isValidAlphaNumericString или isValidUserName. Который использует мой собственный неявный класс stringOps. Это особенно полезно, когда речь идет о сложных требованиях, таких как имена авторов и т. Д. Требуется, чтобы строка не имела только последовательных -_. или пробелы и т. д. Использование сложных регулярных выражений. Но зачем останавливаться? Строка не ограничена должным образом, так как некоторая функция может отображать анонимную функцию и разбивать переменную после ее проверки. Это не очень безопасный способ. Я хочу создать типы для каждой из этих ограниченных строк, привязанных к признаку ConstrainedString, который позволяет мне указать, как каждый тип имеет дело с методами.Создание литералов типа в scala, например. AplhaNumericString

Я борюсь с его проектной стороной. В принципе, мне нужна помощь.

Что происходит, когда функция прерывает ограничение? Есть ли способ поймать это во время компиляции? Ограничить ли мой тип только тем, что методы знают, что не нарушит ограничение, т. Е. Конкатенация 2 AlphaNumericString всегда будет возвращать буквенно-цифровую строку? Или у меня есть фактический тип как Option [String], так что если контракт нарушен, значение становится None? Должен быть лучший путь, помимо исключения исключений во всем мире.

Im предполагая, что лучший способ достичь этого через струноподобные класс типов аналогично этому примеру http://danielwestheide.com/blog/2013/02/06/the-neophytes-guide-to-scala-part-12-type-classes.html например

За исключением я хочу, чтобы иметь возможность написать

val foo:Bar = "This is a valid Bar" 

Я полагаю, подходящим способом является обеспечение неявное преобразование строки в Bar, указывая на метод apply() Bar, который проверяет, является ли метод допустимым. Мечта состоит в том, чтобы работать, как Numbers, в scala, и это невозможно скомпилировать.

//fails to compile due to - not being a valid character 
val foo:AlphaNumericString = "-Adlsa85464" 

Если кто-то на самом деле реализовать что-то похоже идентификатор любят смотреть на код иначе:

Есть простой способ сохранить ограничение независимо от функции выдает

Является ли моя теория о том, как Подходите к этому вопросу правильно?

ответ

1

Похоже, что подходит для Макросов Scala. См. this post. Вы можете иметь свои собственные типы строк и выполнять проверку времени компиляции.

0

Представьте себе, что вы компилятор Scala :) Как бы вы подойти задача не суметь задание как val foo: AlphaNumericString = someString() без собственно оценки с правой стороны и функцию преобразования?

Это был только мой длинный путь, чтобы сказать, что то, о чем вы просите, очевидно невозможно.