zauważyłem, że zestaw testowy dla Data.Set
tylko naprawdę definiuje Arbitrary Set a
sensownie dla a ~ Int
, ale aby uniknąć GHC specjalny ~
używaJak zdefiniować instancję dla konkretnej aplikacji typu w Haskell 98?
instance Enum a => Arbitrary (Set a)
Jak mogę się upewnić, tylko instancja Arbitrary (Set Int)
jest stosowany bez konieczności jakichkolwiek rozszerzeń GHC ? W GHC-tylko kodu, chciałbym użyć jednej FlexibleInstances
lub GADTs
a następnie albo
instance Arbitrary (Set Int)
lub
instance a ~ Int => Arbitrary (Set a)
Warto może wspomnieć: to daje gwarancję chcesz poza systemem, ale nie w środku. Oznacza to, że GHC nie wywnioskuje z 'IsInt a', że' a ~ Int'. Może to czasami wymagać denerwujących dodatkowych adnotacji typu. Nie sądzę, że można to osiągnąć wyłącznie w H98 (lub H2010). –
@ Danielhagner, tak, jest zdecydowanie gorszy od podejścia GHC. Jeśli ograniczenia równości są zawsze ujednolicone, zdecydowanie będę je preferował. Ale "pojemniki" na ogół starają się być tak "przenośne", jak to możliwe, więc jeśli mogę zrobić to, czego potrzebuję bez rozszerzenia, zrobię to. – dfeuer
@DanielWagner, myślę, że warto również zauważyć, że ta implementacja jest zgodna z GHC, ponieważ można zastosować 'fromIntF' do' Refl :: Int: ~: Int', aby uzyskać coś typu 'IsInt a => Int: ~ : a'. W rzeczywistości będzie to działało dla każdego podobnego rodzaju równości, niezależnie od tego, jak pasuje do tego języka. – dfeuer