szukam typu Haskell z następującej własności (z użyciem egzotycznych rozszerzeń GHC jest w porządku ze mną ...): Dla wszystkich przesuwny t następujące dwa typy są izomorficzne:Czy istnieje taki "uniwersalny" typ Haskella?
forall a. C a => t a -> a
i
t A -> A.
W moim konkretnym przypadku, C jest następujące klasy:
class Floating a => C a where
fromDouble :: Double -> a
Innymi słowy, jakoś chciałby pociągnąć kwantyfikator ogólny nad wszystkimi rodzajami o w klasie C w rodzaju , tak że funkcja t A -> A daje mi funkcję dla wszystkich a. Więc myślę, że szukam „uniwersalnego” instancji klasy C w pewnym sensie ...
Rozważałam wszystkie rodzaje fantazyjnych definicji , wzdłuż linii
newtype A = A (forall b. C b => b)
lub
data A = forall b. C b => A b
lub
newtype A = A (forall t b. (Traversable t, C b) => t b -> b),
lub
data A = FromDouble Double | Plus A A | Tanh A | ...
lub nawet
data A = A (forall t. Traversable t => t A -> A),
i wszystkie mogą być łatwo wykonane instancje klasy C, ale nie mają one właściwość muszę (a przynajmniej ja nie widzę w jaki sposób uzyskać tę właściwość z którejkolwiek z moich powyższych definicji).
W dni nieparzyste Jestem przekonany, typ A po prostu nie istnieje, w dni parzyste Jestem przekonany, że z przeciwnej ...
... więc każda pomoc będzie bardzo mile widziane!
aby dać pewną motywację do mojego pytania: Ja mocno przechylony na Edward Kmett's ad library dla mojego neural networks library, aw mojej pierwszej próbie, używałem swego rodzaju Numeric.AD.Rank1.Kahn automatycznego różnicowania i wstecznej propagacji błędów. Doprowadziło to do miłego API, ale było mniej wydajne niż jego odwrotny tryb, który niestety używa kwantyfikacji jak w moim pytaniu do kodowania różnych funkcji.
Miałem nadzieję, że mogę mieć to, co najlepsze z obu światów - jeden specyficzny (abstrakcyjny) typ plus efektywność odwrotnego trybu.
Czy możesz zrobić cokolwiek z 'C a => t a', którego nie możesz zrobić z' t a'? –
Czy masz na myśli cały. C a => t a? W takim przypadku odpowiedź brzmi "tak", ponieważ możesz użyć metod klasy C, aby coś zrobić z literą a. –
Czy możesz pokazać konkretny przykład? W twoim przypadku jedyna metoda klasy nie może zbadać istniejących wartości. –