mam jakiś rodzaj contrived:polimorficzne ograniczenie
{-# LANGUAGE DeriveFunctor #-}
data T a = T a deriving (Functor)
... i tego typu jest wystąpienie pewnej klasie contrived:
class C t where
toInt :: t -> Int
instance C (T a) where
toInt _ = 0
Jak mogę wyrazić ograniczenie funkcji, która jest T a
instancja jakiejś klasy dla wszystkich a
?
Na przykład rozważmy następującą funkcję:
f t = toInt $ fmap Left t
Intuicyjnie spodziewałbym wyżej funkcja działała od toInt
prac nad T a
dla wszystkich a
, ale nie mogę wyrazić, że w tego typu. To nie działa:
f :: (Functor t, C (t a)) => t a -> Int
... bo gdy stosujemy fmap
typ stał Either a b
. Nie mogę rozwiązać ten problem przy użyciu:
f :: (Functor t, C (t (Either a b))) => t a -> Int
... bo b
nie reprezentuje zmienną powszechnie ilościowo. Nie mogę powiedzieć:
f :: (Functor t, C (t x)) => t a -> Int
... lub użyj forall x
się sugerować, że ograniczenie jest ważne we wszystkich x
.
Moje pytanie brzmi, czy istnieje sposób, aby powiedzieć, że ograniczenie jest polimorficzne w stosunku do niektórych zmiennych tego typu.
Zakładam, że coś takiego jak 'klasa C T gdzie toInt :: TA -> Int' nie będzie działać i trzeba' C' się być rodzaju '* -> Więzienie "? Czy pomocny jest tutaj polimorfizm? –
@ C.A.McCann Konstruktor typu betonu, który mam na myśli to 'Proxy' z' pipes', a konkretną klasą jest 'Monad'. Używam funkcji użytkowych klasy typów dla typów proxy, dlatego istnieje ograniczenie. Podążając za twoją sugestią, zdefiniowałbym wtedy klasę 'MonadP' wyspecjalizowaną w kształcie konstruktora typu" Proxy "i użyłaby tego jako ograniczenia. Wadą jest to, że jeśli użytkownicy chcieli pisać funkcje użyteczności proxy w języku polimorficznym w typie proxy, musieliby ponownie powiązać notację, aby zamiast tego używać 'MonadP'. –
Nie można tego zrobić bezpośrednio, ale można symulować, tak jak w odpowiedzi Romana. Oto odpowiedni bilet GHC: http://hackage.haskell.org/trac/ghc/ticket/2893 – glaebhoerl