Список элементов типов, ограниченных классом типов

Я пытаюсь закодировать список элементов, типы которых ограничены экземплярами некоторого класса:

{-# 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'

Кажется, я даже не смог определить экземпляр для синонимичного типа ...

Мне известно о гетерогенных коллекциях вики-статье, но я хочу знать, почему именно мой подход не работает - мне кажется естественным определять тип, ограничивая коллекция только для того, чтобы содержать элементы с типами, которые являются экземпляром некоторого класса типов.

15
задан andreypopp 8 June 2011 в 20:47
поделиться