Я часто вижу функции с подписью, такие как:типы представляют математический интервал
let f (lower: int) (upper: int) =
//...
где lower
и upper
представляют верхнюю и нижнюю границу некоторого диапазона, что функция собирается работать дальше. То, что отсутствует в этой сигнатуре типа, - это информация о том, являются ли верхние и нижние границы инклюзивными или эксклюзивными. В хороший день эта информация будет в документации ...
Мне кажется, что было бы гораздо лучше иметь тип (ы) для представления mathematical interval, чтобы API-интерфейсы могли указать точный вид интервала и вызывающие абоненты будут получать ошибки компиляции, если они не смогли его предоставить. Я попытался найти такую реализацию, но ничего не придумал, поэтому этот вопрос, чтобы узнать, знает ли кто-нибудь о подходящей реализации. Я хотел бы использовать тот, который может быть использован с языка .NET, но также могут быть полезны другие реализации, которые я мог бы заимствовать идеи.
В идеале дизайн должен позволять подписи функций, показанные ниже. {} Содержит спецификацию интервала в стандартном интервале нотации - это должны быть заменены соответствующими типами:
let f1 (interval: { [,] }) = // inclusive lower and upper bounds
//..
let f2 (interval: { (,) }) = // exclusive lower and upper bounds
//..
let f3 (interval: { [,) }) = // inclusive lower and exclusive upper bounds
//..
let f4 (interval: { [∞,) }) = // infinite lower and exclusive upper bounds
//..
let f5 (interval: { not empty }) = // a non-empty interval
//..
let f6 (interval: { any interval }) = // accepts any kind of interval
//..
Эта проблема сложнее, если мы считаем, что этот тип интервал должен быть универсальным по типу данных, но для начала давайте ограничим его на не общий вариант, который работает для одного типа данных (например, ints или double или date).
Уточнение: Я просто спрашиваю, знает ли кто-нибудь об библиотеке, которая обеспечивает такую реализацию.
Извинения. Я надеялся, что кто-то может указать мне на библиотеку, которая обеспечивает такую функциональность. Я добавлю пояснения к вопросу. – Akash
Вопрос не в интервалах, а в * ограничениях. Вы обнаружите, что есть такие понятия. Их проще указывать в F #. Языки, такие как ADA и Eiffel, даже имеют эти понятия, испеченные в –
@JohnPalmer Я подозреваю, что вы неправильно поняли вопрос. Речь идет не о написании кода или поиске библиотеки вообще. Речь идет о определении типов со значениями ограничений, которые могут быть соблюдены языком/компилятором. F # * имеет единицы измерения. .NET * имеет * ограничения. Другие языки даже позволяют указать допустимый диапазон значений при объявлении типа –