29

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

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

4

1 回答 1

22

好问题!

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

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

于 2013-01-23T10:17:19.703 回答