haskell compilation ghc language-extension

haskell - ¿Puede el uso local de UndecidableInstances pragma tener consecuencias globales en la finalización de la compilación?



compilation ghc (1)

Supongamos que un diseñador de bibliotecas Haskell decide utilizar UndecidableInstances por alguna razón. La biblioteca compila bien. Ahora supongamos que algún programa usa la biblioteca (como define algunas instancias de sus clases de tipo), pero no usa la extensión. ¿Puede suceder que la compilación falle (no termine)?

Si tal escenario puede suceder, estaría feliz de ver un ejemplo. Por ejemplo, como mtl usa UndecidableInstances mucho, ¿es posible escribir un programa que dependa de mtl (o cualquier otra biblioteca estándar que use la extensión), no usa UndecidableInstances sí, pero no se compila debido a la indecidibilidad?


Gran pregunta

En general esto es ciertamente posible. Considere este módulo:

{-# 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

Se compila por sí solo muy bien. Sin embargo, si importa este módulo y define

g x = x + f [x]

obtendrás

Context reduction ; 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]

Con respecto a las instancias de MTL, no veo cómo algo como esto es posible, pero tampoco tengo una prueba de que no lo sea.