Я новичок в мире программирования на 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
Хорошо, надеюсь, это достаточно ясное объяснение проблемы, чувствую, что я пропустил действительно очевидный ответ, но он не выпрыгнул на меня. } Обычно я хочу, чтобы он вызвал myApi.exec и возвратил ...
У меня есть упрощенная функция, которая выглядит так:
function(query) {
myApi.exec('SomeCommand', function(response) {
return response;
});
}
В основном я хочу, чтобы она вызывала myApi.exec
и возвращала ответ, который дается в лямбде обратного вызова. Однако приведенный выше код не работает и просто немедленно возвращается.
Просто для очень хакерской попытки я попробовал следующее, что не сработало, но, по крайней мере, вы понимаете, чего я пытаюсь достичь:
function(query) {
var r;
myApi.exec('SomeCommand', function(response) {
r = response;
});
while (!r) {}
return r;
}
В принципе, какой хороший способ сделать это с помощью «node.js / событийного»? Я хочу, чтобы моя функция дождалась вызова обратного вызова, а затем вернула значение, которое ей было передано.