Pracuję więc nad zabawnym eksperymentem w znaczeniu kontekstowym i biegnę w ścianę. Próbuję zdefiniować typ danych, który może być prymitywny lub funkcja, która przekształca się z jednego konstruktora na inny.Zawieranie konstruktorów w podpisie
data WeaponPart =
WInt Int |
WHash (Map.Map String Int) |
WNull |
WTrans (WeaponPart -> WeaponPart)
instance Show WeaponPart where
show (WInt x) = "WInt " ++ (show x)
show (WHash x) = "WHash " ++ (show x)
show (WTrans _) = "WTrans"
show WNull = "WNull"
cold :: WeaponPart -> WeaponPart
cold (WInt x) = WHash (Map.singleton "frost" x)
cold (WHash x) = WHash $ Map.insertWith (+) "frost" 5 x
cold (WTrans x) = cold $ x (WInt 5)
cold (WNull) = cold $ (WInt 5)
ofTheAbyss :: WeaponPart -> WeaponPart
ofTheAbyss (WTrans x) = x (WTrans x)
problemów jest to, że podpis na ofTheAbyss
umożliwia dowolną WeaponPart jako argument, a chcę tylko, aby umożliwić WTrans-constructred argumenty. Widzisz, napisałem tylko wzór pasujący do tego przypadku.
Próbowałem już współpracować z GADT, ale obawiam się, że była to dziura od królika. Nigdy nie mogłem ich zmusić do robienia tego, co chciałem. Czy ktoś ma jakieś pomysły, jak mogę wymusić tylko argumenty WTrans na TheAbyss? Czy po prostu zupełnie czegoś brakuje.
Dzięki.
Best, Erik
To jest fantastyczna odpowiedź. Miałem na myśli to, że sposób w jaki korzystałem z GADT był króliczą dziurą, ale ktoś, oczywiście, o wiele mądrzejszy, mógł to zrozumieć. I moje światło, ktoś zrobił! Wspaniale. Nigdy nie zrozumiałbym, jak to zrobić w obie strony, a mianowicie, aby mieć związek broni i część broni. Jest to również doskonały przykład systemów wbudowanych, które oszczędzają dzień. –
Ostatnią rzeczą, mam pracę, która jest dla mnie ogromnie ekscytująca. Jedyną rzeczą, którą musiałem zmienić, było to, że musiałem wyjąć część PolyKinds i utworzyć 'data Sort = Base | Połączenie "w" bazy danych "i" datowe połączenie ". Narzeka, słusznie, że Base nie był konstruktorem typu. Czy jest coś, czego mi brakuje w PolyKinds? Najprawdopodobniej. –
Ahh, zostawię swój błąd, by inni mogli się uczyć: potrzebowałem pragma DataKinds, a nie pragma PolyKinds. Wszystkie te wymyślne nowe rozszerzenia. –