29 votes

L'utilisation du pragma UndecidableInstances localement peut-elle avoir des conséquences globales sur l'arrêt de la compilation?

Supposons qu'une bibliothèque Haskell designer décide d'utiliser UndecidableInstances , pour une raison quelconque. La bibliothèque compile bien. Maintenant, supposons qu'un programme utilise la bibliothèque (comme le définit certains cas, de son type de classes), mais ne l'utilisez pas l'extension. Peut-il arriver que la compilation échoue (ne pas arrêter)?

Si un tel scénario peut arriver, je serais heureux de voir un exemple. Par exemple, comme mtl utilise UndecidableInstances beaucoup, est-il possible d'écrire un programme qui dépend de mtl (ou toute autre bibliothèque standard qui utilise l'extension), ne pas utiliser UndecidableInstances lui-même, mais ne parvient pas à compiler, car d'indécidabilité?

22voto

Roman Cheplyaka Points 15145

Grande question!

En général, cela est certainement possible. Considérez ce module:

 {-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, UndecidableInstances #-}

module M where

class C a b | a -> b where
  f :: a -> b

instance C a b => C [a] [b]
  where f = map f
 

Il se compile très bien par lui-même. Cependant, si vous importez ce module et définissez

 g x = x + f [x]
 

tu auras

 Context reduction stack overflow; size = 201
Use -fcontext-stack=N to increase stack size to N
  C [b] b
In the second argument of `(+)', namely `f [x]'
In the expression: x + f [x]
In an equation for `g': g x = x + f [x]
 

En ce qui concerne les instances mtl, je ne vois pas comment quelque chose comme ça est possible, mais je n'ai pas non plus de preuve que ce n'est pas le cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X