fun x | (x + 3) > 0 = 1
| x <3 = -1
Паттерн-матчинг из области значений
Например:
структурирующая ф-ция> struct-three-ints : int # int # int -> three-ints;
обратная ф-ция> destruct-three-ints : three-ints -> int # int # int;
struct-three-ints^(-1) = destruct-three-ints
Конструирование и деструктуризация - простые и взаимовыводимые функции, поэтому обратную функцию конструктору явно задавать нет смысла (пускай лучше язык сам это разрулит - всё однозначно жеж), но почему бы не использовать тот же принцип в явном виде для других ф-ций?
Пример:
ord : char -> num; // ord - порядковый номер переданного аргументом символа в таблице ascii
chr : num -> char; // chr - n-й символ из таблицы ascii, где n - переданное аргументом число
ord^(-1) = char;
// теперь некоторая ф-ция
f : num -> num;
f(chr(x)) = ...;
Здесь chr(x) - паттерн-функция. Проверка типа состоит в сравнениях типа её домена с ожидаемым f типом и типа кодомена с типом переданного при вызове f аргумента. В случае успешного сопоставления типов, к переданному аргументу применяется обратная ф-ция, т.е. ord. Пример непрактичный, но наглядный.
Дальше много фантазирования на тему константных аргументов у ф-ций, с множественным их числом... Например, для бинарного +, фиксируя аргумент, получаем функцию сложения с константой, которой имеется обратная (вычитание из результата данной константы) и тд индуктивно.
Конечно, похоже на покушение на строгую типизацию, но строго-типизированное покушение же (: ф-ция при любом раскладе получит свой тип.
А может нечто подобное где-то используется?
К вопросу.
В разных языках программирования сопоставления с образцом могут иметь различную реализацию. По сути все они используются для удобства диспетчиризации управления.
В Haskell`e есть опровержимые и неопровержимые сопоставления. Последних три типа. Это так.. для справки.
В простейшем случае например
fun 0 = eval1
fun n = eval2
на си это выглядело бы как if (val == 0) {eval1;} else {eval2;}
ни кто не мешает нам расширить этот пример не только для значения 0.
На тему константных аргументов у функций и паттерн функций. В Haskell есть охранное сопоставление с образцом и case выражения.
Пример охранного выражения.
Код:
Для использования сопоставления с образцом не только при определении функции есть case выражения. Используя case и клозы можно свести твой вопрос к сопоставлению с конструирующей функцией (в твоей терминалогии).