4

有没有办法导出记录“getter”而不是“setter”?

例子。假设我们有M1.hs

module M1(customCtor, field1) where
  data DType = DCtor { field1 :: Int }
  customCtor = DCtor { field1 = 1 }

M2.hs

import M1
modified = customCtor{ field1 = 3 }  -- how to prevent this?
main = putStrLn . show . field1 $ modified

我希望能够field1在 M2.hs 中运行 getter,但不能在 M1 之外更新记录。如果可能的话,你能指出我Haskell文档的相关部分吗?如果不是,你能解释为什么吗?

4

1 回答 1

2

一个相当简单的选择是定义同义词并导出:

module M1(customCtor, getField1) where

data DType = DCtor { field1 :: Int }
customCtor = DCtor { field1 = 1 }

getField1 = field1

这里,getField1是一个“getter”函数(类型:)DType -> Int,它获取field1但不具有作为更新记录字段的附加状态。

于 2013-09-08T08:59:57.853 回答