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