[Haskell] Proof-carrying code.
От: Паблик Морозов  
Дата: 24.02.12 23:11
Оценка:
Предлагаю в этой теме заняться сабжем, тем более в новой версии компилятора значительно улучшили поддержку type-level программирования.

Общая идея: приписываем к хаскеллевским типам данных фантомный тип, содержащий некоторое утверждение относительно значения. Вот так http://www.haskell.org/haskellwiki/Generalised_algebraic_datatype#Example_with_lists, например, можно добавлять к спискам информацию о наличии/отсутсвии в них элементов. Разумеется, в реальных примерах хотелось бы иметь расширяемый некий фреймворк, позволяющий не только нести встроенную информацию о наличии/отсутсвии элементов, но и дающий пользователю возможность добавлять свои утверждения. Как мы видим, сейчас это невозможно.

Вроде бы относящаяся к теме ссылка: http://okmij.org/ftp/Computation/lightweight-dependent-typing.html (сам еще не разбирался).

Предлагаю для разогрева реализовать тип моноида, который бы нёс информацию о том, является ли элемент единицой моноида. Т.е. (ложный псевдокод):

mappend :: (Monoid a) => TaggedMonoid a Identity -> TaggedMonoid a Identity -> TaggedMonoid a Identity
mappend _ _ = Tag mempty

mappend :: TaggedMonoid a Identity -> TaggedMonoid a NonIdentity -> TaggedMonoid a NonIdentity
mappend _ b = b

mappend :: TaggedMonoid a NonIdentity -> TaggedMonoid a Identity -> TaggedMonoid a NonIdentity
mappend a _ = a

mappend :: TaggedMonoid a NonIdentity -> TaggedMonoid a NonIdentity -> TaggedMonoid a NonIdentity
mappend a b = tag $ (untag a) `mappend` (untag b)

Ссылки, код, соображения на тему пишите в эту нить. Я тоже буду время от времени.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.