型がいくつかの型クラスのインスタンスに制限されているアイテムのリストをエンコードしようとしています:
{-# 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"]]
しかし、コンパイルはエラーで失敗します:
Test.hs:14:10:
Illegal polymorphic or qualified type: SomeGroup
In the instance declaration for `Someable SomeGroup'
同義型のインスタンスを定義することさえできなかったようです...
異種コレクションの wiki 記事は知っていますが、私のアプローチがうまくいかない理由を正確に知りたいです。ある型クラスのインスタンスである型を持つアイテムのみを含むようにコレクションを制限することによって、型を定義するのが自然に思えます。