2015-06-29 15 views
3

Я часто вижу функции с подписью, такие как:типы представляют математический интервал

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).

Уточнение: Я просто спрашиваю, знает ли кто-нибудь об библиотеке, которая обеспечивает такую ​​реализацию.

+0

Извинения. Я надеялся, что кто-то может указать мне на библиотеку, которая обеспечивает такую ​​функциональность. Я добавлю пояснения к вопросу. – Akash

+0

Вопрос не в интервалах, а в * ограничениях. Вы обнаружите, что есть такие понятия. Их проще указывать в F #. Языки, такие как ADA и Eiffel, даже имеют эти понятия, испеченные в –

+2

@JohnPalmer Я подозреваю, что вы неправильно поняли вопрос. Речь идет не о написании кода или поиске библиотеки вообще. Речь идет о определении типов со значениями ограничений, которые могут быть соблюдены языком/компилятором. F # * имеет единицы измерения. .NET * имеет * ограничения. Другие языки даже позволяют указать допустимый диапазон значений при объявлении типа –

ответ

6

Я не видел, чтобы какая-либо библиотека F # делала что-то вроде этого. Я думаю, что это довольно сложный вопрос без четкого ответа - это очень зависит от того, какие операции вам нужно делать с интервалами (например, есть ли у вас какие-то функции, которые работают на любые интервалы?)

Если вы просто хотел иметь различные F типы # для различных интервалов, можно определить множество простых типов данных, используя что-то вроде этого:

module Interval = 
    type InclIncl = InclIncl of int * int 
    type InclExcl = InclExcl of int * int 
    type InfExcl = InfExcl of int 

Тогда каждая из функций будет принимать соответствующий тип:

let f1 (Interval.InclIncl(a, b)) = 0 
let f2 (Interval.InclExcl(a, b)) = 0 
let f3 (Interval.InfExcl(a)) = 0 

Однако это означает что вы не можете писать функцию, которая занимает какой-либо интервал. Таким образом, во многих сценариях может иметь смысл иметь один тип, представляющий «интервал», который может представлять все случаи:

type Boundary = 
    | Inclusive of int 
    | Exclusive of int 
    | Unbounded 

type Interval = Boundary * Boundary 
+0

Я вижу, что F7 - это исследовательский проект, который добавляет типы уточнения к F #, хотя он пытается сделать гораздо больше, чем проверку диапазона. Существуют ли какие-либо концепции/методы, которые могут быть легко использованы в вопросе ОП? –

+0

@Tomas Спасибо за эти два предложения, но я действительно ищу что-то, что их объединяет. – Akash

+0

@PanagiotisKanavos Я не слышал о типах уточнения, но из тех немногих, что я читал до сих пор, они, похоже, больше сдерживают числовые значения. Я не прошу указать интервал [-5, 7] в системе типов - я просто хочу, например, указать, что функция примет любой интервал формы [a, b) – Akash

Смежные вопросы