我正在检查当前没有模板-haskell/一些镜头幻想的做法来处理以下简单情况:
data Person = Person {
name :: String,
...
}
data Company = Company {
name :: String,
...
}
目前,我通过限定导入来避免污染全局命名空间,但它确实使记录访问变得笨拙。
import Person as P
isFred :: Person -> Bool
isFred p = (P.name p) == "Fred"
真的没有更好的方法来访问记录字段吗?
我接受@Emmanuel Touzery 的回答,因为有用的链接指向另一个涵盖相同领域的问题。另一个问题没有出现在“haskell 命名空间”的搜索中。其他答案没有错,但我只能接受一个。
那里提到的解决方案使用模板 Haskell、镜头、类型类等,基本上为每个字段“HasName”创建一个类型类,并使用单个函数“名称”。然后,每个数据类型都是该类的一个实例,具有自己的实现。然后有一些我不完全理解的魔法允许涉及不同的类型。
对于任何想知道这是怎么回事的 Haskell 新手来说,这是因为记录基本上是元组,其字段选择器实现为普通函数,用于选择(例如)该元组的第二个元素。如果您导出这些字段选择器函数,那么它们位于全局命名空间中,迟早(通常更早)您会遇到冲突。
所以 - 你要么限定导入(如我上面的示例),要么尝试提出不冲突的名称(前缀名称并希望最好)。
镜头的东西在 2013 年风靡一时,允许组合字段选择器/吸气剂 + 设置器等。镜头的基本概念并不太复杂,但实现就在我头上。
为了记录(哈!)我认为另一篇文章中的解决方案可能是我所追求的,但它确实涉及大量的魔法(5 个扩展只是为了伪造记录命名空间)。