Je joue avec une bibliothèque d'enregistrements extensible, et je veux écrire une fonction field
qui peut fonctionner comme Lens
ou Traversal
selon que la clé Symbol
soit dans la liste des clés. La famille de type est donné:Les familles de types ne peuvent pas renvoyer un type RankN - solutions de contournement ou alternatives?
type family LensOrTraversal key keys s t a b where
LensOrTraversal key '[] s t a b =
Traversal s t a b
LensOrTraversal key (key =: val ': xs) s t a b =
Lens s t a b
LensOrTraversal key (foo =: bar ': xs) s t a b =
LensOrTraversal key xs s t a b
Ce code me donne une erreur:
/home/matt/Projects/hash-rekt/src/Data/HashRecord/Internal.hs:433:5:
error:
• Illegal polymorphic type: Traversal s t a b
• In the equations for closed type family ‘LensOrTraversal’
In the type family declaration for ‘LensOrTraversal’
Idéalement, je voudrais être en mesure de réutiliser le nom field
pour les lentilles et traversals, comme il le ferait vous permettent d'écrire
>>> let testMap = empty & field @"foo" .~ 'a'
>>> :t testMap
HashRecord '["foo" =: Char]
>>> testMap ^. field @"foo"
'a'
>>> testMap ^. field @"bar"
Type error
>>> testMap ^? field @"bar"
Nothing
qui suit lens
communs idiomes. Je peux fournir une fonction fieldTraversal
qui fait ce que je veux, mais je préférerais surcharger le nom field
si possible. Comment travailleriez-vous autour de cette limitation des familles de caractères?
double possible de [illégaux de type polymorphes ou qualifiés en utilisant RankNTypes et TypeFamilies] (http://stackoverflow.com/questions/13846284/illegal-polymorphic-or-qualified-type-using-rankntypes-and-typefamilies) –
@ AntalSpector-Zabusky peut-être lié, mais ce n'est certainement pas un doublon. – leftaroundabout