Haskell で単純な遺伝的アルゴリズムを作成しようとしています。最初のステップは、次のように「遺伝的」な個人の型クラスを作成することであると考えました。
class Genetic a where
fitness :: (Ord b) => a -> b
これは私には理にかなっているように思えます-私は必ずしもフィットネス関数をFloat
orのような型に制限したくありませんDouble
.概念的には、フィットネス関数が行うべきことは、個体の順序付けを提供することだけです.
ただし、String
ラッパーにこの型クラスを実装すると、次のようになります。
data DNA = DNA String
instance Genetic DNA where
fitness (DNA s) = length s
GHC で次のエラーが表示されます。
Could not deduce (b ~ Int)
from the context (Ord b)
bound by the type signature for fitness :: Ord b => DNA -> b
これは、型クラス関数を定義する方法ではありませんか? 関数を特定の具象型に制限したり、別の型変数を型クラス コンストラクターに提供したりする必要がありますか?