是否可以在本地使用 UndecidableInstances 杂注对编译终止产生全局影响



假设一个Haskell库设计师出于某种原因决定使用UndecidableInstances。该库编译良好。现在假设某个程序使用该库(例如定义其类型类的某些实例),但不使用扩展。编译会失败(不终止)吗?

如果这种情况可以发生,我很乐意看到一个例子。例如,由于 mtl 经常使用UndecidableInstances,是否有可能编写一个依赖于 mtl(或任何其他使用该扩展的标准库)、不使用UndecidableInstances本身但由于不可判定性而无法编译的程序?

好问题!

一般来说,这当然是可能的。考虑以下模块:

{-# 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 实例,我不明白这样的事情是怎么可能的,但我也没有证据证明它不是。

最新更新