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

Хорошо, надеюсь, это достаточно ясное объяснение проблемы, чувствую, что я пропустил действительно очевидный ответ, но он не выпрыгнул на меня. } Обычно я хочу, чтобы он вызвал 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 / событийного»? Я хочу, чтобы моя функция дождалась вызова обратного вызова, а затем вернула значение, которое ей было передано.

246
задан Flimzy 9 July 2014 в 07:20
поделиться