Je suis en train de programmer une bibliothèque de type dépendante dans Haskell. En utilisant le profilage sur mon exécutable test que je vois quelque chose comme:Coût d'exécution de la programmation de type dépendante avec GHC
commutativity' Math 1189 4022787186 29.1 27.2 29.1 27.2
commutativity'
est essentiellement (récursive) la preuve de l'addition entière propriété de commutativité pour les entiers de niveau de type. Il est défini ceci:
commutativity' :: SNat n -> SNat m -> Plus (S n) m :~: Plus n (S m)
commutativity' SZ m = Refl
commutativity' (SS n) m = gcastWith (commutativity' n m) Refl
Et puis utilisé dans ma bibliothèque gcastWith
pour prouver l'équivalence des différents types. Donc ... 29% de mon temps d'exécution est dépensé pour quelque chose de complètement inutile, puisque la vérification de type se produit au moment de la compilation.
J'avais naïvement supposé que cela n'arriverait pas.
Y at-il quelque chose que je peux faire pour optimiser ces appels inutiles?
Ceci est le coût de ne pas utiliser une langue totale. Tapez la sécurité repose sur l'évaluation des preuves à la forme canonique. Dans le total des langues, les épreuves peuvent être approuvées sans évaluation et ainsi effacées lors de l'exécution. Vous pouvez prendre la touche de confiance et utiliser 'unsafeCoerce', une fois que vous avez vérifié que votre programme dépasse le typechecker. – pigworker
Voir section 4.4.4 "Exécution d'épreuves" de la thèse de Richard A. Eisenberg https://arxiv.org/abs/1610.07978 – danidiaz
Je rêve de GHC intégrant un vérificateur de terminaison (résumé), et d'optimiser/réécrire automatiquement les "preuves" en utilisant le zéro coercitions-coût. Ce serait vraiment gentil. – chi