有没有办法导出记录“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

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

最佳答案

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

module M1(customCtor, getField1) where

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

getField1 = field1

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

关于Haskell 记录 setter 导出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18681865/

10-12 23:32