私は Haskell プログラミングの世界に不慣れで、巡回セールスマン問題の適切な解決策を見つけるための単純な遺伝的アルゴリズムに歯を食いしばっています。私はソリューションを整数の順列として表現しているので、このタイプのシノニムがあります
type Genome = [Int]
アルゴリズム自体は、解を操作する一連の関数です。
mutation :: Genome -> Genome
selectParents :: [Genome] -> [Genome] -> [Genome]
crossover :: Genome -> Genome -> (Genome, Genome)
selectSurvivors :: [Genome] -> [Genome] -> [Genome]
私のコードが私の質問にどの程度関連しているかわかりませんので、詳細が必要かどうか尋ねてください。言及する価値があるかもしれないことの 1 つは、上記の型シグネチャが実際には単純化されていることです。実際、私は State モナドを使用して を持ち歩いているStdGen
ため、これらすべての関数は実際にステートフルな計算を返します。
これでやりたいことがいくつかありますが、頭を悩ませることはできません。ソリューションにさまざまな表現を選択できるようにしたいのですが、これは型クラスを使用するのに自然な場所であると思われるためGenome
、型クラスと[Int]
this の特定のインスタンスになりますGenome
。
今、私は実装を実験できるようになりたいと思っています。また、他のプロジェクトでコードを使用できるようにしたいと考えています。このような型クラスを使用すると、新しいアルゴリズムを作成するたびに の別のインスタンスを作成する必要がありますがGenome
、これはライブラリを作成する良い方法ですか?
おまけの質問の 1 つですが、私を悩ませているのは、関数の型シノニムのようなものを作成して、関数を引数として受け取る関数を作成する場合に、型全体ではなくシノニムを作成できるようにする方法はありますか?関数の署名、つまり次のようなものが機能するようにします。
type someFunc = [Int] -> [Int] -> Int
someOtherFunc :: someFunc -> [Int] -> Int
そうです、うまくいけば、それが問題の十分に明快な説明です。私は本当に明白な答えを見逃したように感じますが、それは私に飛びつきませんでした. 乾杯