Можно ли использовать неприменимые переменные pragma локально, имеют глобальные последствия для завершения компиляции?
Предположим, что разработчик библиотеки Haskell решает использовать UndecidableInstances
по какой-либо причине. Библиотека отлично компилируется. Теперь предположим, что какая-то программа использует библиотеку (например, определяет некоторые экземпляры ее классов типов), но не использует расширение. Может ли случиться, что компиляция не завершена (не завершается)?
Если такой сценарий может произойти, я был бы рад увидеть пример. Например, поскольку mtl использует UndecidableInstances
много, возможно ли написать программу, которая зависит от mtl (или любой другой стандартной библиотеки, использующей расширение), не использует UndecidableInstances
сам, но не может скомпилироваться из-за неразрешимости?
Ответы
Ответ 1
Отличный вопрос!
В целом это, безусловно, возможно. Рассмотрим этот модуль:
{-# 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
Он сам компилируется. Однако, если вы импортируете этот модуль и определите
g x = x + f [x]
вы получите
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]
Что касается экземпляров mtl, я не вижу, как это возможно, но у меня также нет доказательств того, что это не так.