Używając typów egzystencjalnych, musimy użyć składni dopasowywania do wzorca, aby wyodrębnić wartość ed forall
. Nie możemy używać zwykłych selektorów rekordów jako funkcji. GHC zgłasza błąd i sugerują, stosując wzór dopasowywania z tej definicji yALL
:Dlaczego nie mogę korzystać z selektorów rekordu z egzystencjalnie kwantyfikowanym typem?
{-# LANGUAGE ExistentialQuantification #-}
data ALL = forall a. Show a => ALL { theA :: a }
-- data ok
xALL :: ALL -> String
xALL (ALL a) = show a
-- pattern matching ok
-- ABOVE: heaven
-- BELOW: hell
yALL :: ALL -> String
yALL all = show $ theA all
-- record selector failed
forall.hs:11:19:
Cannot use record selector `theA' as a function due to escaped type variables
Probable fix: use pattern-matching syntax instead
In the second argument of `($)', namely `theA all'
In the expression: show $ theA all
In an equation for `yALL': yALL all = show $ theA all
Część moich danych zajmie więcej niż 5 elementów. Trudno utrzymać kod jeśli używam wzorzec-dopasowanie:
func1 (BigData _ _ _ _ elemx _ _) = func2 elemx
Czy istnieje dobry sposób, aby kod tak utrzymaniu lub owinąć go tak, że mogę użyć jakiegoś selektorów?
Podpowiedź: Jaki byłby typ 'theA'? –
@Louis Wasserman: masz na myśli używanie składni egzystencjalnej w YALL? w jaki sposób? – Nybble
Zasadniczo, odpowiedź jest taka, że nie ma ona typu wyraźnego, więc aby uzyskać działający typ, potrzebne jest dopasowanie wzoru. –