Услуги для генерации типов Haskell в Haskell («Второй заказ Haskell»)?

StackOverflow https://stackoverflow.com/questions/4067731

Вопрос

Заранее извиняюсь, если этот вопрос немного расплывчатся. Это результат на выходных мечтания.

С чудесным типом типов Haskell, это восхитительно приятное, чтобы выразить математическую (особенно алгебраическую) структуру как типовые опечатки. Я имею в виду, просто посмотрите на Число-прелюдияДействительно Но воспользовавшись такими замечательными типа структуры на практике всегда казалась мне трудной для меня.

У вас есть хороший тип типа системы выражения того, что v1 а также v2 элементы векторного пространства V и что w это элемент векторного пространства W. Отказ Система типа позволяет написать программу добавления v1 а также v2, но нет v1 а также w. Отказ Здорово! Но на практике вы можете захотеть играть с потенциально сотнями векторных помещений, и вы, конечно, не хотите создавать типы V1, V2, ..., V100 И объявить их экземплярами вектора Typleass! Или, может быть, вы прочитали некоторые данные из реального мира, в результате чего символы a, b а также c - Вы можете выразить, что свободное векторное пространство на этих символах действительно является векторным пространством!

Так ты застрял, верно? Чтобы сделать много вещей, которые вы хотели бы сделать с векторными пространствами в научных вычислениях, вы должны отказаться от вашей сертификации, прежде всего, выбрав векторный космический осмотр, а имеющие функции выполнения проверки совместимости во времени. Должны ли вы должны? Разве невозможно было бы использовать тот факт, что Haskell является чисто функциональным для записи программы, которая генерирует все типы, которые вам нужны и вставляют их в реальную программу? Существует ли такая техника? Всеми способами вы можете указать, если я просто с видом на что-то простое (я, вероятно, я) :-)

Редактировать: Только сейчас я обнаружил финансирование. Отказ Мне нужно немного подумать о том, как они относятся к своему вопросу (просвещающие комментарии в отношении этого ценится).

Это было полезно?

Решение

Шаблон haskell. позволяет этому. То Wiki Page имеет некоторые полезные ссылки; особенно Булата Учебники.

Синтаксис декларации верхнего уровня - это тот, который вы хотите. Набрав:

mkFoo = [d| data Foo = Foo Int |]

Вы генерируете шаблон Haskell Splice (например, функция с компиляцией), которая создаст декларацию для data Foo = Foo Int просто вставляя линию $(mkFoo).

Хотя этот небольшой пример не слишком полезен, вы можете предоставить аргумент Mkfoo контролировать, сколько разных объявлений, которые вы хотите. Сейчас $(mkFoo 100) будет производить 100 новых деклараций данных для вас. Вы также можете использовать для генерации экземпляров классов типа. Мой адаптивный кортеж Пакет - это очень маленький проект, который использует шаблон Haskell, чтобы сделать что-то подобное.

Альтернативный подход будет использовать Выводить, который автоматически получает экземпляры классов типа. Это может быть проще, если вам нужны только экземпляры.

Другие советы

Также в Haskell есть несколько простых методов программирования на уровне типа. Канонический пример следует:

-- A family of types for the natural numbers
data Zero
data Succ n

-- A family of vectors parameterized over the naturals (using GADTs extension)
data Vector :: * -> * -> * where
    -- empty is a vector with length zero
    Empty :: Vector Zero a
    -- given a vector of length n and an a, produce a vector of length n+1
    Cons  :: a -> Vector n a -> Vector (Succ n) a

-- A type-level adder for natural numbers (using TypeFamilies extension)
type family Plus n m :: *
type instance Plus Zero n = n
type instance Plus (Succ m) n = Succ (Plus m n)

-- Typesafe concatenation of vectors:
concatV :: Vector n a -> Vector m a -> Vector (Plus n m) a
concatV Empty ys = ys
concatV (Cons x xs) ys = Cons x (concatV xs ys)

Найдите минутку, чтобы принять это. Я думаю, что это довольно волшебно, что он работает.

Тем не менее, программирование уровня типа в Haskell находится в особенности-скрещенной долине - достаточно, чтобы привлечь внимание к тому, сколько вы не можете сделать. Зависимо напечатанные языки, такие как АГДА, Кокс, а также Эпиграмма Возьмите этот стиль до его предела и полной власти.

Шаблон Haskell гораздо больше похоже на обычный стиль кода Lisp-Macro из генерации кода. Вы пишете какой-нибудь код, чтобы написать какой-нибудь код, то вы говорите «Хорошо вставьте, что сгенерированный код здесь». В отличие от вышеуказанной техники, вы можете написать любой вычислимо-указанный код таким образом, но вы не получаете очень общие TypeCheckecking, как видно в concatV над.

Таким образом, у вас есть несколько вариантов делать то, что вы хотите. Я думаю, что MetaProgramming - действительно интересное пространство, а в некоторых способах все еще довольно молоды. Иметь удовольствие от изучения. :-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top