я заметил, что набор тестов для Data.Set
только действительно определяет Arbitrary Set a
благоразумно для a ~ Int
, но, чтобы избежать GHC специальный ~
он используетКак определить экземпляр для приложения определенного типа в Haskell 98?
instance Enum a => Arbitrary (Set a)
Как я могу убедиться, что только экземпляр Arbitrary (Set Int)
используется без необходимости каких-либо расширений GHC ? В GHC-только код, я хотел бы использовать либо FlexibleInstances
или GADTs
, а затем либо
instance Arbitrary (Set Int)
или
instance a ~ Int => Arbitrary (Set a)
Может быть, стоит упомянуть: это дает гарантию, которую вы хотите вне системы, но не внутри него. То есть, GHC не будет выходить из 'IsInt a', что' a ~ Int'. Иногда это может потребовать раздражающих аннотаций дополнительного типа. Я не думаю, что это может помочь только в H98 (или H2010). –
@ Даниэль Вагнер, да, это определенно уступает подходу GHC. Если ограничения равенства будут стандартизованы, я определенно их предпочту. Но «контейнеры» обычно стараются быть «переносимыми», насколько это возможно, поэтому, если я смогу сделать то, что мне нужно без расширения, я сделаю это. – dfeuer
@ DanielWagner, я думаю, стоит также отметить, что эта реализация совместима с GHC, поскольку вы можете применять 'fromIntF' к' Refl :: Int: ~: Int', чтобы получить что-то типа 'IsInt a => Int: ~ : a'. Действительно, это будет работать для любого подобного типа равенства, независимо от того, как он вписывается в язык. – dfeuer