Haskell: абстрагирование генетического алгоритма

Я новичок в мире программирования на Haskell, и я режу зубы на простом генетическом алгоритме для поиска хороших решений проблемы коммивояжера. Я представляю решения как перестановки целых чисел, и поэтому у меня есть синоним этого типа

type Genome = [Int]

Сам алгоритм представляет собой набор функций, которые работают с решениями:

mutation :: Genome -> Genome
selectParents :: [Genome] -> [Genome] -> [Genome]
crossover :: Genome -> Genome -> (Genome, Genome)
selectSurvivors :: [Genome] -> [Genome] -> [Genome]

I ' Я не уверен, какая часть моего кода имеет отношение к моему вопросу, поэтому, пожалуйста, спросите, нужны ли дополнительные сведения. Стоит упомянуть одну вещь: сигнатуры типов, приведенные выше, на самом деле упрощены, я фактически использую монаду State для переноса StdGen , поэтому все эти функции фактически возвращают вычисления с сохранением состояния.

Там Вот несколько вещей, которые я хотел бы сделать с этим, но не могу понять. Я хочу дать возможность выбирать различные представления для решений, мне кажется, что это было бы естественным местом для использования класса типов, так что Genome будет классом типа, а [ Int] конкретный экземпляр этого генома .

Теперь я хочу поэкспериментировать с реализациями, и я хочу иметь возможность использовать код в других проектах. Использование такого класса типов потребовало бы, чтобы каждый новый алгоритм, который я создавал, требовал от меня создания еще одного экземпляра Genome , это хороший способ создать библиотеку?

Один бонусный вопрос, просто то, что меня беспокоило, есть ли способ создать что-то вроде синонима типа для функции, чтобы, если я пишу функцию, которая принимает функции в качестве аргументов, я могу написать синоним, а не всю подпись типа функции, т.е. чтобы работало что-то вроде следующего:

type someFunc = [Int] -> [Int] -> Int
someOtherFunc :: someFunc -> [Int] -> Int

Хорошо, надеюсь, это достаточно ясное объяснение проблемы, чувствую, что пропустил действительно очевидный ответ, но он не выпрыгнул на меня. Ура

18
задан Alex jg 15 February 2011 в 22:28
поделиться