使用IHP生成类型时,如何限定字段名称解决命名冲突?
解决IHP中字段命名冲突的方案
当多个表存在同名字段(比如updated_at),导致生成的updatedAt访问器重名、编译器无法识别时,可以用以下几种方法解决:
方法1:使用Lambda表达式提供类型上下文
通过显式的record访问语法,让编译器通过参数类型推断出对应的字段访问器:
let sortedIssues :: [Issue] = sortOn (\issue -> issue.updatedAt) issues
这里issue的类型被上下文限定为Issue,编译器就能明确调用的是Issue类型对应的updatedAt。
方法2:用TypeApplications指定类型
直接给字段访问器标注所属类型,需要启用TypeApplications扩展(IHP项目通常默认开启,若未开启可在文件顶部加{-# LANGUAGE TypeApplications #-}):
let sortedIssues :: [Issue] = sortOn (updatedAt @Issue) issues
@Issue明确告诉编译器,这里的updatedAt是针对Issue类型的字段访问器。
方法3:手动定义专属别名
在自己的业务模块里,给Issue的updatedAt起一个唯一的别名,避免冲突:
-- 先定义别名,注意替换成实际的字段类型(比如UTCTime) issueUpdatedAt :: Issue -> UTCTime issueUpdatedAt = updatedAt -- 之后直接用别名排序 let sortedIssues :: [Issue] = sortOn issueUpdatedAt issues
这种方式把多态的updatedAt固定为只针对Issue类型的单态函数,彻底避免命名冲突。
内容的提问来源于stack exchange,提问作者stephenbenedict
相关产品推荐
相关产品推荐

