Czy możemy przekształcić GADT bez danego ograniczenia na jego konstruktorach na GADT, który ma wspomniane ograniczenie? Chcę to zrobić, ponieważ chcę uzyskać głębokie osadzenie Arrows i zrobić kilka interesujących rzeczy z reprezentacją, która (na razie) wydaje się wymagać Typeable
. (One reason)Przekształcanie GADT bez ograniczeń w inny GADT z ograniczeniami, gdy takie więzy zatrzymają się.
data DSL a b where
Id :: DSL a a
Comp :: DSL b c -> DSL a b -> DSL a c
-- Other constructors for Arrow(Loop,Apply,etc)
data DSL2 a b where
Id2 :: (Typeable a, Typeable b) => DSL2 a a
Comp2 :: (Typeable a, Typeable b, Typeable c) => DSL2 b c -> DSL2 a b -> DSL2 a c
-- ...
Mogliśmy wypróbować następującą from
funkcję ale łamie szybko jak my nie mają Typeable
informacje dla punktu rekurencyjnego
from :: (Typeable a, Typeable b) => DSL a b -> DSL2 a b
from (Id) = Id2
from (Comp g f) = Comp2 (from g) (from f)
Zamiast więc staramy się uchwycić transformacji w klasie typu. Jednak to się załamie, a my będziemy tracić informacje, ponieważ b
jest egzystencjalnym.
class From a b where
from :: a -> b
instance (Typeable a, Typeable b) => From (DSL a b) (DSL2 a b) where
from (Id) = Id2
from (Comp g f) = Comp2 (from g) (from f)
Jakieś inne sugestie? Ostatecznie chcę utworzyć głębokie osadzanie Category
i Arrow
wraz z Typeable
informacji o parametrach typu. Jest tak, że mogę użyć składni strzałki, aby skonstruować wartość w moim DSL i mieć dość standardowy kod Haskella. Może muszę uciekać się do szablonu Haskella?
W ghc 7.8 każdy typ będzie miał możliwą do przypisania instancję automatycznie wyprowadzoną przez kompilator, dzięki czemu przeszkoda nie będzie już obowiązywać. W rzeczywistości uważam, że funkcja jest w obecnej wersji 7.7 HEAD, więc ograniczenie nie ma już zastosowania do tych, którzy chcą odważnie budować ghc ze źródła –
Ale nawet w GHC 7.8 żadna informacja nie będzie dostępna dla typu egzystencjalnego. – kosmikus
W przypadku nowej funkcji w GHC 7.8 ważne jest, aby chociaż każdy konkretny typ był możliwy do zobrazowania, nie byłby w stanie założyć, że można go użyć dla zmiennej/polimorficznej/zmiennej - na przykład jako jedyna całkowita funkcja typu (a -> a) nadal musiałaby być funkcją tożsamościową. W przeciwnym razie stracilibyśmy parametryczność. Sprawia jednak, że mój specyficzny kontrargument jest nieważny. –