Я новичок в мире программирования на Haskell и режу зубы по простому генетическому алгоритму для нахождения хороших решений проблемы коммивояжера. Я представляю решения как перестановки на целых числах, и поэтому у меня есть синоним этого типа
type Genome = [Int]
Сам алгоритм представляет собой набор функций, которые работают с решениями:
mutation :: Genome -> Genome
selectParents :: [Genome] -> [Genome] -> [Genome]
crossover :: Genome -> Genome -> (Genome, Genome)
selectSurvivors :: [Genome] -> [Genome] -> [Genome]
Я не уверен, какая часть моего кода относится к моему вопросу, поэтому, пожалуйста, спросите, нужны ли дополнительные сведения. Одна вещь, о которой стоит упомянуть, это то, что сигнатуры типов, приведенные выше, на самом деле упрощены, я на самом деле использую монаду State для переноса StdGen
, поэтому все эти функции фактически возвращают вычисления с состоянием.
Есть несколько вещей, которые я хотел бы сделать с этим, но не могу полностью разобраться. Я хочу сделать возможным выбор различных представлений для решений, мне кажется, что это было бы естественным местом для использования класса типов, так что Genome
будет классом типов и [Int]
конкретным экземпляром этого Genome
.
Теперь я хочу иметь возможность экспериментировать с реализациями, и я хочу иметь возможность использовать код в других проектах. Использование класса типов, подобного этому, потребует, чтобы каждый новый алгоритм, который я создаю, требовал от меня создания другого экземпляра Genome
. Это хороший способ создания библиотеки?
Один дополнительный вопрос, просто вещь, которая меня беспокоит, есть ли способ создать что-то вроде синонима типа для функции, так что если я пишу функцию, которая принимает функции в качестве аргументов, я могу написать синоним, а не вся сигнатура функции, т. е. чтобы сработало что-то вроде следующего.
type someFunc = [Int] -> [Int] -> Int
someOtherFunc :: someFunc -> [Int] -> Int
Правильно, надеюсь, это достаточно ясное объяснение проблемы, чувствую, что я пропустил действительно очевидный ответ, но он не выскочил на меня. Приветствия