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.