Sto cercando di codificare un elenco di elementi che hanno limitato i tipi di essere le istanze di una classe tipo:Elenco degli elementi di tipi sono limitati dal typeclass
{-# LANGUAGE RankNTypes, TypeSynonymInstances, LiberalTypeSynonyms #-}
module Test where
class Someable a where
some :: a -> String
data Some = Some String
type SomeGroup = forall a. Someable a => [a]
instance Someable Some where
some (Some v) = v
instance Someable SomeGroup where
some (x:xs) = (some x) ++ ", " ++ (some xs)
main = do
putStrLn $ show.some [Some "A", [Some "B", Some "C"]]
Ma compilazione fallisce con l'errore:
Test.hs:14:10:
Illegal polymorphic or qualified type: SomeGroup
In the instance declaration for `Someable SomeGroup'
sembra che persino riuscito a definire istanza per tipo sinonimo ...
sono consapevole di heterogenous collections articolo wiki, ma vogliono sapere perché esattamente il mio approccio non funziona - è Mi sembra naturale definire il tipo limitando la raccolta solo per contenere elementi con tipi che sono un'istanza di una classe tipo.
Quello che stai cercando di fare qui ha senso, ma non è ben supportato da Haskell, ed è di solito un sintomo di un design non idiomatico. Se sei curioso di sapere come farlo, @hammar ti dà un punto di partenza. Se incontri questa situazione in codice reale, probabilmente starai meglio a ripensare il tuo approccio. –