Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Паттерн-матчинг из области значений

29K
29 октября 2009 года
Ander Skirnir
109 / / 08.06.2009
Пока что по литературе мне знаком подход, в котором паттерн может содержать термы, константы и конструкторы - и это уже довольно мощный механизм. Но чем по сути является деструктуризация при матчинге по конструктору? Вызовом неявно заданной обратной конструированию функции (конечно, зависит от реализации, но в любом случае, формально это можно описать так).
Например:
структурирующая ф-ция> 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. Пример непрактичный, но наглядный.

Дальше много фантазирования на тему константных аргументов у ф-ций, с множественным их числом... Например, для бинарного +, фиксируя аргумент, получаем функцию сложения с константой, которой имеется обратная (вычитание из результата данной константы) и тд индуктивно.

Конечно, похоже на покушение на строгую типизацию, но строго-типизированное покушение же (: ф-ция при любом раскладе получит свой тип.

А может нечто подобное где-то используется?
361
29 октября 2009 года
Odissey_
661 / / 19.09.2006
Три раза переписывал тебе ответ, потому что для меня все эти рассуждения несоклько туманными кажутся=) В итоге показалось что понял, но не уверен =)

К вопросу.
В разных языках программирования сопоставления с образцом могут иметь различную реализацию. По сути все они используются для удобства диспетчиризации управления.

В Haskell`e есть опровержимые и неопровержимые сопоставления. Последних три типа. Это так.. для справки.

В простейшем случае например

fun 0 = eval1
fun n = eval2

на си это выглядело бы как if (val == 0) {eval1;} else {eval2;}
ни кто не мешает нам расширить этот пример не только для значения 0.

На тему константных аргументов у функций и паттерн функций. В Haskell есть охранное сопоставление с образцом и case выражения.

Пример охранного выражения.
 
Код:
fun x | (x + 3) > 0 = 1
      | x <3           = -1

Для использования сопоставления с образцом не только при определении функции есть case выражения. Используя case и клозы можно свести твой вопрос к сопоставлению с конструирующей функцией (в твоей терминалогии).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог