8

Haskell で単純な遺伝的アルゴリズムを作成しようとしています。最初のステップは、次のように「遺伝的」な個人の型クラスを作成することであると考えました。

class Genetic a where
    fitness :: (Ord b) => a -> b

これは私には理にかなっているように思えます-私は必ずしもフィットネス関数をFloatorのような型に制限したくありません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

これは、型クラス関数を定義する方法ではありませんか? 関数を特定の具象型に制限したり、別の型変数を型クラス コンストラクターに提供したりする必要がありますか?

4

1 に答える 1

14

Luqui は、問題が何であるかを説明しました。本当に必要なのは、型に最も適した特定fitnessのインスタンスである場合、呼び出し元が要求する可能性のあるインスタンスを提供できる必要があるということですOrd

これは、関連付けられた型シノニムの非常に優れたアプリケーションである IMO です。

{-# LANGUAGE TypeFamilies, FlexibleInstances, FlexibleContexts #-}

class (Ord (Fitness a)) => Genetic a where
  type Fitness a :: *
  fitness :: a -> Fitness a

data DNA = DNA String
instance Genetic DNA where
  type Fitness DNA = Int
  fitness (DNA s) = length s
于 2013-06-13T23:59:13.187 に答える