класса типов Я пытаюсь кодировать список элементов, которые имеют типов, ограниченных экземпляры некоторого типа класса:Список предметов, ограниченных типов
{-# 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'
кажется, я даже не смог определить экземпляр для типа синонимов ...
Я знаю heterogenous collections вики статьи, но хочу знать, почему именно мой подход не работает - это мне кажется естественным определить тип, ограничивая сбор только содержащими элементы с типами, которые являются экземплярами некоторого типа.
То, что вы пытаетесь сделать здесь, имеет смысл, но оно не очень хорошо поддерживается Haskell и обычно является симптомом неидиоматического дизайна. Если вам интересно, как это сделать, @hammar дает вам отправную точку. Если вы столкнетесь с этой ситуацией в реальном коде, вам, вероятно, будет лучше переосмыслить ваш подход. –