OCaml 4 и GADские Типы

Jul 30, 2012 18:10

Раз все молчат, напишу я. На днях вышел Окамл 4.0, в котором появились GADT. Рассказать о них можно на классическом примере: AST. Пусть у нас есть язычок с целыми числами, которые можно складывать и сравнивать. Результат сложения - целое число, результат сравнения - булев. Есть выражение if, в котором должно быть булево условие и пара выражений ( Read more... )

ocaml, fp

Leave a comment

Comments 33

isorecursive July 30 2012, 11:57:46 UTC
В Hoopl их изящно используют - для описания открыто-закрытости форм потока управления:
http://hackage.haskell.org/packages/archive/hoopl/3.8.7.4/doc/html/src/Compiler-Hoopl-Graph.html#O

For example,
• A shift-left instruction is open on entry (because control can
fall into it from the preceding instruction), and open on exit
(because control falls through to the next instruction).
• An unconditional branch is open on entry, but closed on exit
(because control cannot fall through to the next instruction).
• A label is closed on entry (because in Hoopl we do not allow
control to fall through into a branch target), but open on exit.

http://research.microsoft.com/en-us/um/people/simonpj/papers/c--/dfopt.pdfhttp://blog

Reply


gds July 30 2012, 12:43:49 UTC
1 ( ... )

Reply

dmzlj July 30 2012, 12:49:59 UTC
я как-то пытался на GADT типизировать опкоды, но не сумел. Пришлось в рантайме проверять.

Reply

gds July 30 2012, 12:51:04 UTC
интересненько, а что требовалось от этой типизации?

Reply

dmzlj July 30 2012, 12:58:23 UTC
Сейчас попробую сформулировать, давненько было.

Суть такова: есть у нас некие команды. У команды есть опкод, и есть операнды.

Опкод --- ну просто некие значения, идущие последовательно, без дырок.

Операнды --- ну, операнды разной разрядности, Word32 допустим. Или Word16. Или Word64. Или Label (которая потом заменяется на Word-соответствующей-разрядности-после-линковки)

С одной стороны, команды обрабатываются унифицировано. Ну, что там с ними делается --- допустим, asm pretty printing или генерация бинарных кодов.

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

Что-то эта задача решалась только через
GADT + экзистенциальные типы + макро для генерации типов, причем GADT в таком случае особенно-то и не нужен оказался. Я так и не осилил это нормально типизировать как-то.

Reply


stdray July 30 2012, 19:02:49 UTC
А разве не через них реализуются всякие option[T] и either[T,U]? Если, конечно, я правильно все понял.

Reply

triampurum July 30 2012, 19:47:28 UTC
вот замечательное определение: http://cstheory.stackexchange.com/questions/10594/whats-the-difference-between-adts-gadts-and-inductive-types/10596#10596
Замечательно двумя вещами: ясностью и полной неожиданностью для многих хаскелистов.

Reply

triampurum July 30 2012, 19:49:12 UTC
(и считаем комментарии "это определение неверно")

Reply

migmit July 30 2012, 19:56:26 UTC
Можно, я буду первым? Это определение - хуйня. jbapple там правильно сказал.

Reply


Leave a comment

Up