Подтвердить что ты не робот

Можно ли использовать неприменимые переменные pragma локально, имеют глобальные последствия для завершения компиляции?

Предположим, что разработчик библиотеки Haskell решает использовать UndecidableInstances по какой-либо причине. Библиотека отлично компилируется. Теперь предположим, что какая-то программа использует библиотеку (например, определяет некоторые экземпляры ее классов типов), но не использует расширение. Может ли случиться, что компиляция не завершена (не завершается)?

Если такой сценарий может произойти, я был бы рад увидеть пример. Например, поскольку mtl использует UndecidableInstances много, возможно ли написать программу, которая зависит от mtl (или любой другой стандартной библиотеки, использующей расширение), не использует UndecidableInstances сам, но не может скомпилироваться из-за неразрешимости?

4b9b3361

Ответ 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, я не вижу, как это возможно, но у меня также нет доказательств того, что это не так.