You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:15:24