Хорошо, поэтому я понимаю, что, вероятно, буду сожалеть об этом всю оставшуюся жизнь, но... Как работает Джинн?
В документации говорится, что он использует алгоритм, который является "расширением LJ" и указывает на длинную запутанную бумагу о LJT. Насколько я могу судить, это сложная система высокоформализованных правил для определения, какие логические утверждения верны или ложны. Но это даже не объясняет, как вы превращаете подпись типа в исполняемое выражение. Предположительно, всякое сложное формальное мышление каким-то образом связано, но картина крайне неполна.
Это похоже на то время, когда я попытался написать интерпретатор Pascal в BASIC. (Не смейтесь, мне было всего двенадцать...) Я потратил несколько часов, пытаясь понять это, и в конце концов мне пришлось сдаться. Я просто не мог понять, как черт вы получаете от гигантской строки, содержащей целую программу, к чему-то, что вы можете сравнить с известными фрагментами программы, чтобы решить, что на самом деле делать.
Ответ, конечно, заключается в том, что вам нужно написать вещь под названием "парсер". Когда вы поймете, что это такое и что он делает, внезапно все становится очевидным. О, это еще не тривиально, чтобы закодировать его, но идея проста. Вам просто нужно написать фактический код. Если бы я знал о парсерах, когда мне было двенадцать, возможно, я бы не потратил два часа, просто глядя на пустой экран.
Я подозреваю, что то, что делает Джинн, принципиально просто, но мне не хватает важной детали, которая объясняет, как вся эта сложная логическая гимнастика связана с исходным кодом Haskell...