haskell - ¿Cuáles son los peligros de usar FlexibleContexts y FlexibleInstances?
ghc language-extension (1)
Como estos contextos e instancias flexibles no están disponibles en el estándar Haskell, supongo que existen problemas potenciales al usarlos. ¿Qué son? ¿Pueden conducir a cierta ambigüedad, indecidibilidad, instancias superpuestas, etc.?
Hay una pregunta similar que solo pregunta sobre FlexibleInstances
, no FlexibleContexts
, pero la respuesta solo dice "que es seguro usarlos".
Una vez tropecé con lo siguiente. Respondiendo a esta pregunta , primero probé este código:
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
class (Eq a, Show a) => Genome a where
crossover :: (Fractional b) => b -> a -> a -> IO (a, a)
mutate :: (Fractional b) => b -> a -> IO a
develop :: (Phenotype b a) => a -> b
class (Eq a, Show a) => Phenotype a b | a -> b where
-- In case of Coevolution where each phenotype needs to be compared to
-- every other in the population
fitness :: [a] -> a -> Int
genome :: (Genome b) => a -> b -- here, the problem
breed parents cross mute = do
children <- mapM (/ (dad, mom) -> crossover cross (genome dad) (genome mom))
parents
let ch1 = map fst children ++ map snd children
mutated <- mapM (mutate mute) ch1
return $ map develop mutated
Y obtuve un error de compilación y una sugerencia de GHCi para agregar la opción FlexibleContexts
. Cuando lo hice, compiló bien. Pero esto en realidad no era lo correcto, ya que la declaración de restricción introdujo un nuevo alcance para las variables de tipo, b
en la firma de tipo del genome
no se relacionó por completo con la de la clase de tipo; con todo FlexibleContexts
proporcionó una cubierta para esto.
Con la restricción especificada correctamente en el nivel de clase de tipo,
class (Eq a, Show a, Genome b) => Phenotype a b | a -> b where
-- In case of Coevolution where each phenotype needs to be compared to
-- every other in the population
fitness :: [a] -> a -> Int
genome :: a -> b
pasó la compilación sin requerir la opción FlexibleContexts
.