これらの柔軟なコンテキストとインスタンスは Haskell 標準では使用できないため、それらを使用する際に潜在的な問題があると思います。彼らは何ですか?それらは、あいまいさ、決定不能、インスタンスの重複などにつながる可能性がありますか?
ではなくについてのみ尋ねる同様の質問がありますが、答えは「それらを使用しても安全です」としか言いません。FlexibleInstances
FlexibleContexts
これらの柔軟なコンテキストとインスタンスは Haskell 標準では使用できないため、それらを使用する際に潜在的な問題があると思います。彼らは何ですか?それらは、あいまいさ、決定不能、インスタンスの重複などにつながる可能性がありますか?
ではなくについてのみ尋ねる同様の質問がありますが、答えは「それらを使用しても安全です」としか言いません。FlexibleInstances
FlexibleContexts
私はかつて次のことにつまずいた。この質問に答えて、最初にこのコードを試しました:
{-# 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
コンパイルエラーが発生し、GHCi からFlexibleContexts
オプションを追加するよう提案されました。私がやったとき、それはOKをコンパイルしました。しかし、これは実際には正しいことではありません。制約宣言によって型変数の新しいスコープが導入され、b
ingenome
の型シグネチャが型クラスの型シグネチャとは完全に無関係になったためです。まだFlexibleContexts
これのカバーを提供しました。
型クラス レベルで適切に指定された制約により、
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
FlexibleContexts
オプションを必要とせずにコンパイルに合格しました。