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

Haskell中如何禁止指定类型的记录更新?

问题:如何在Haskell中实现不可更新但可访问字段的关联类型

背景

最初定义的类型如下:

data Person = Person
  { worksFor :: String
  , ...
  }

data Company = Company
  { companyId :: String
  , address :: String
  ,...
  }

companies :: [Company]
people :: [Person]

Person的worksFor字段通过companyId关联对应的Company。之后调整为直接引用的类型:

data Person' = Person'
  { worksFor :: Company'
  , ...
  }

data Company' = Company'
  { ...
  }

调整后存在两个问题:多个Person'无法共享同一个Company'实例;更新某个Company'时,引用它的Person'值不会同步更新。

需求

希望实现更简洁的方案,核心要求是:禁止Person'和Company'类型的任何记录更新操作,但仍能正常访问它们的字段。了解IxSet这类工具,但不想使用这么复杂的方案。

已尝试的方案

  • 方案一:在单独模块中启用NoTraditionalRecordSyntax,不用记录语法定义Company'和Person'(比如data Company' = Company' String String ...),手动定义模仿GHC生成的选择器函数,同时不导出类型构造器。但这种方式过于繁琐。
  • 方案二:用data Gettable a = Gettable { get :: a }包装每个字段,且不导出Gettable构造器。但每次访问字段都要加上get,代码不够美观。

请问有没有其他更合适的实现方式?

内容的提问来源于stack exchange,提问作者Philip Kamenarsky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:32:08