Заранее извиняюсь, если этот вопрос немного расплывчатый.Это результат мечтательных выходных.
С замечательной системой типов Haskell приятно представить математическую (особенно алгебраическую) структуру в виде классов типов.Я имею в виду, просто посмотрите на числовой прелюдии !Но использование такой замечательной структуры типов на практике всегда казалось мне трудным.
У вас есть хороший способ системы типов выразить, что v1
и v2
являются элементами векторного пространства V
, а w
является элементом векторного пространства W
,Система типов позволяет написать программу с добавлением v1
и v2
, но не v1
и w
.Большой!Но на практике вам, возможно, захочется поиграть с потенциально сотнями векторных пространств, и вы определенно не хотите создавать типы V1
, V2
, ..., V100
и объявлять их экземплярами класса типов векторного пространства!Или, может быть, вы читаете некоторые данные из реального мира, в результате чего появляются символы a
, b
и c
- вы можете захотеть выразить, что свободное векторное пространство над этими символами действительно является векторным пространством!
Так ты застрял, верно?Чтобы сделать многие вещи, которые вы хотели бы сделать с векторными пространствами в научной вычислительной среде, вы должны отказаться от своей системы типов, отказавшись от класса типов векторных пространств, и вместо этого функции должны выполнять проверки совместимости во время выполнения.Должны ли вы?Разве нельзя использовать тот факт, что Haskell является чисто функциональным, чтобы написать программу, которая генерирует все нужные вам типы и вставляет их в настоящую программу?Существует ли такая техника?Обязательно укажите, если я просто пропускаю что-то простое здесь (я, вероятно, так): -)
Редактировать: Только сейчас я обнаружил fundeps .Я должен немного подумать о том, как они относятся к моему вопросу (просвещающие комментарии по этому поводу приветствуются).