【问题标题】:What is the best way to do C-struct in haskell? [duplicate]在haskell中做C-struct的最好方法是什么? [复制]
【发布时间】:2015-10-03 00:12:32
【问题描述】:

目前我使用数据 fields 来模拟 C 结构。但我发现与object.property 等领域驱动的编程方式不同,在haskell 中,属性名称都被转储到模块命名空间中。当我有多个这样的结构时,这会产生一些问题。例如,如果我有两种数据类型怎么办:

data Person = Person { name :: Text, address :: Text }
data Dog = Dog { name :: Text, breed :: Text }

然后 GHC 会抱怨:Multiple declarations of ‘name’。因此我必须用前缀命名“属性”:

data Person = Person { getPersonName :: Text, getPersonAddress :: Text }
data Dog = Dog { getDogName :: Text, getDogBreed :: Text }

这有必要吗?还是我使用了错误的方式来定义结构?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    可以使用-XDisambiguateRecordFields 扩展名。它允许这样做:在多个数据声明中使用相同名称的记录标签。

    但是,您应该考虑是否真的需要这样做。如果两种数据类型包含相同的概念性内容,是否最好从这两种类型中删除该字段并在通用包装器中使用它?

    data Person' = Person { address :: Text }
    data Dog' = Dog { breed :: Text }
    
    data Named b = Named { name :: Text, being :: b }
    
    type Person = Named Person'
    type Dog = Named Dog'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多