Haskell为何将类型族的停滞应用视为合法类型?
Haskell封闭类型族停滞应用的疑问
以下是我测试用的代码(已将类型族改为封闭类型族):
-- 一个未定义任何实例的封闭类型族 type family EmptyTypeFamily t where -- 1. 由于没有`instance EmptyTypeFamily ()`,这个类型实际不存在 type NotAType = EmptyTypeFamily () -- 2. 为这个“不存在的类型”定义值 untypedValue :: NotAType untypedValue = undefined main :: IO () main = do -- 3. 可以在表达式中使用这个无有效类型的值 return untypedValue return . id . fix $ \x -> untypedValue -- 最终报错!找不到`Show (EmptyTypeFamily ())`的实例 print untypedValue
我发现一个非常违反直觉的现象:可以命名类型族的停滞应用、为其定义值,甚至在表达式中使用它。明明这个类型并不存在,自然无法为它定义类型类实例,但为什么仅仅命名这个“非类型”、甚至使用它时都不会报错?这大大增加了代码问题的排查难度。我查阅了GHC文档,其中两次提到“停滞”的概念,但并没有解答我的疑问。我想知道,Haskell为何会将EmptyTypeFamily ()视为允许定义值等操作的合法类型,而实际上它并非一个合法的类型?
内容的提问来源于stack exchange,提问作者Blue Nebula
相关产品推荐
相关产品推荐

