Comment Haskell résoudre le problème « structure de données normalisée immuable »?modèle de données Normalisé et immuable
Par exemple, considérons une structure de données représentant les ex petites amies/petits amis:
data Man = Man {name ::String, exes::[Woman]}
data Woman = Woman {name :: String, exes::[Man]}
Qu'advient-il si une femme change son nom et elle avait été avec 13 l'homme? Alors tout l'homme devrait être "mis à jour" (au sens de Haskell) aussi? Une sorte de normalisation est nécessaire pour éviter ces "mises à jour".
Ceci est un exemple très simple, mais imaginez un modèle avec 20 entités et les relations arbitraires entre eux, quoi faire alors?
Quelle est la méthode recommandée pour représenter des données complexes, normalisées dans une langue immuable?
Par exemple, une solution Scala se trouvent here (voir code ci-dessous), et il utilise des références. Que faire à Haskell?
class RefTo[V](val target: ModelRO[V], val updated: V => AnyRef) {
def apply() = target()
}
Je me demande, si des solutions plus générales comme celle-ci (en Scala) ne fonctionnent pas dans Haskell ou ils ne sont pas nécessaires? Si elles ne fonctionnent pas, alors pourquoi pas? J'ai essayé de chercher des bibliothèques qui le font dans Haskell mais elles ne semblent pas exister. En d'autres termes, si je veux modéliser une base de données SQL normalisée dans Haskell (par exemple pour être utilisé avec acid-state) existe-t-il un moyen général de décrire les clés étrangères? En général, je veux dire, ne pas coder à la main les identifiants comme suggéré par chepner dans les commentaires ci-dessous.
EDIT:
Pourtant, autrement dit, est-il une bibliothèque (pour Haskell ou Scala) qui implémente une base de données SQL/relationnelle en mémoire (éventuellement en utilisant l'approvisionnement de l'événement pour la persistance) de telle sorte que la base de données est immuable et la plupart des opérations SQL (query/join/insert/delete/etc.) sont implémentées et sont sécurisées. S'il n'y a pas une telle bibliothèque, pourquoi pas? Cela semble être une très bonne idée. Comment devrais-je créer une telle bibliothèque?
EDIT 2:
Quelques liens connexes:
- https://realm.io/news/slug-peter-livesey-managing-consistency-immutable-models/
- https://tonyhb.gitbooks.io/redux-without-profanity/content/normalizer.html
- https://github.com/agentm/project-m36
- https://github.com/scalapenos/stamina
- http://www.haskellforall.com/2014/12/a-very-general-api-for-relational-joins.html
Si vous aviez des données normalisées, auriez-vous pas 'data Man = Man {nom :: String, exes :: [WomanID]}', où 'womanID' était un index dans une histoire de structure de données' valeurs Woman' (quelque chose comme 'Map WomanID Woman'?) Si vous changez le nom d'une valeur' Woman', ceci n'affecte pas la valeur de 'Man' qui la référence, vous avez seulement besoin de mettre à jour la valeur unique dans' Map' – chepner
l'exemple donné n'est pas normalisé La question est de savoir s'il existe une solution générale pour créer des structures de données normalisées (quelque chose qui s'occupe de la gestion des identifiants, etc.) Je veux dire, que font les Haskeller lorsqu'ils veulent créer des données normalisées? Doivent-ils toujours coder à la main les identifiants? Ou y a-t-il déjà une solution plus générale à ce problème? Ce que vous avez proposé est un exemple de codage à la main des ID, mais cela pourrait être automatisé. résol ving ces ID. – jhegedus
@jhegedus La question en l'état est un peu large - cela dépend vraiment de la situation. Si vous mettez constamment à jour les hommes et les femmes, vous pouvez effectuer le calcul dans une monade d'état (l'état étant la table/carte des hommes/femmes). Si vous cherchez une approche fonctionnelle pour des structures de graphes plus générales, consultez ['fgl'] (https://hackage.haskell.org/package/fgl). En ce qui concerne les IDs: il y a des situations où vous pouvez [attacher le noeud] (https://wiki.haskell.org/Tying_the_Knot) (parfois même en utilisant le 'Map'), mais en général vous devrez peut-être donner des ID de code . – Alec