Sto provando a scrivere un semplice algoritmo genetico in Haskell. Ho pensato che il primo passo dovrebbe essere quello di fare un typeclass per gli individui che sono 'genetica', in questo modo:Uso dei più comuni tipi di tipi di tipi di font
class Genetic a where
fitness :: (Ord b) => a -> b
Questo mi sembra ragionevole - Non necessariamente voler limitare le funzioni di fitness a un tipo come Float
o Double
e concettualmente tutta la funzione di idoneità dovrebbe fare è fornire un ordine degli individui.
Tuttavia, quando a implementare questo typeclass per un String
involucro:
data DNA = DNA String
instance Genetic DNA where
fitness (DNA s) = length s
vedo il seguente errore nel GHC:
Could not deduce (b ~ Int)
from the context (Ord b)
bound by the type signature for fitness :: Ord b => DNA -> b
Non è questo come dovrei definire le funzioni typeclass? Devo limitare la funzione a un tipo concreto specifico o fornire un'altra variabile di tipo al costruttore typeclass?
Questo è un problema comune. La tua firma significa che * il chiamante * deve scegliere il tipo ordinabile, quindi 'fitness' deve essere in grado di fabbricare un valore di qualsiasi tipo ordinabile e restituirlo. Nota, 'Void' (il tipo senza valori) è ordinabile, quindi questo è impossibile. Probabilmente vuoi parametrizzare 'Genetic' nello spazio degli ordini:' class (Ord b) => Genetico b a dove fitness :: a -> b' – luqui
@luqui Grazie, penso di averlo capito. A dimostrazione di ciò, sembra che a Haskell non piacciano i typeclass con parametri di tipo multi-tipo. Chi avrebbe mai pensato. –
@DanielBuckmaster yes ma l'estensione 'MultiParamTypeclasses' è piuttosto comune per usare – jozefg