June 9th, 2010

with Cat The Cat

Зачем нужны выкрутасы с типами.

В общем, чтобы совершать меньше ошибок.

С помощью типов мы фиксируем область доступных значений, и когда начинаем комбинировать выражения, то неправильные комбинации отсекаются, как не попадающие в заданные нами области.

Это очень ценно в случае языков программирования - вообще, в случае языков, просто программирование ближе.

В качестве примера приведу стековую машину, она умеренно проста и умеренно интересна.

Collapse )

Вот.

Исходник тут: http://thesz.mskhug.ru/svn/misc/TypedStack.hs

Там есть даже умеренно хорошее решение для очень интересной проблемы: как типизировать использование открытого файла. Стековый эффект этого действия таков: ( string -- handle TRUE | FALSE), то есть, у нас на вершине стека может быть возвращено либо два значения сразу, либо одно, при этом количество значений зависит от значения на вершине стека.

Я запихнул handle (в моём примере String) в тип Maybe Handle. А для ветвления использовал специальный вид if, maybes, он есть в исходнике. Он принимает на вход два действия, одно для случая, когда на вершине Just something, стековый эффект этого действия ( (inp,something) -- outp), и другое для случая, когда на вершине Nothing, стековый эффект этого действия ( inp -- outp). Комбинация действий приводит к общему стековому эффекту ( (inp,Maybe something) -- outp).

То же можно сделать для более сложного типа Either, когда стековый эффект подобен ( string -- handle TRUE | error-code FALSE). И тд, и тп.

Если кому-то в голову придёт реализовывать стековую машину в виде DSEL - вполне нормальная задача, кстати, вон, dmzlj отказался от Форта из-за большого количества ошибок в программах, а так он ему нравился, - то, конечно же, примитивы надо перенумеровать, условные конструкции сделать отдельными вариантами типа StackOp, сделать вызов именованных сущностей (те же определения через :; в Форте) и тд, и тп. Ядро останется таким же.

PS
Не забыть, что Maybe something занимает более одной ячейки в стеке, поэтому DUP и OVER не должны работать с такими значениями.

Типами же можно ограничить работу с двойными словами, что фортеры любят. Чак Мур, так тот вообще считал, что целочисленная арифметика годится в 99.9(9)%.