UndecidableInstances
假设一个 Haskell 库设计者出于某种原因决定使用它。该库编译良好。现在假设某个程序使用该库(例如定义其类型类的一些实例),但不使用扩展。编译失败(不会终止)会发生吗?
如果这种情况可能发生,我很乐意看到一个例子。例如,由于mtl使用UndecidableInstances
很多,是否可以编写一个依赖于mtl(或任何其他使用扩展的标准库)的程序,不使用UndecidableInstances
自己,但由于不确定性而无法编译?
UndecidableInstances
假设一个 Haskell 库设计者出于某种原因决定使用它。该库编译良好。现在假设某个程序使用该库(例如定义其类型类的一些实例),但不使用扩展。编译失败(不会终止)会发生吗?
如果这种情况可能发生,我很乐意看到一个例子。例如,由于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 实例,我看不出这样的事情是怎么可能的,但我也没有证据证明它不是。