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
相关产品推荐
相关产品推荐

