You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GHC 9.2.4中同类型Options记录更新触发ambiguous-fields警告的疑问

问题原因及解决办法

你遇到的ambiguous-fields警告,根源出在-XDuplicateRecordFields扩展的设计逻辑上:

当开启这个扩展后,字段选择器(比如unwrapUnaryRecords)不再和单一类型绑定——GHC允许不同类型定义同名的字段。哪怕你的customDefaultOptions明确是Options类型,GHC也无法确定你要更新的是Options的unwrapUnaryRecords字段,还是其他可能存在的、也定义了这个字段的类型的字段。GHC 9.2.4开始收紧了这个检查,提前预警未来版本会彻底不支持这种模糊的写法。

解决办法

有几种方式可以消除这个歧义:

  • 显式指定字段所属类型:直接在字段前加上类型限定,明确告诉GHC你要更新的是Options类型的字段:
import Data.Aeson

customDefaultOptions :: Options
customDefaultOptions = defaultOptions {omitNothingFields = True}

newtypeOptions :: Options
newtypeOptions = customDefaultOptions { Options.unwrapUnaryRecords = True }
  • 用TypeApplications扩展明确类型:开启TypeApplications扩展后,通过类型应用语法指定字段对应的类型:
{-# LANGUAGE TypeApplications #-}
import Data.Aeson

customDefaultOptions :: Options
customDefaultOptions = defaultOptions {omitNothingFields = True}

newtypeOptions :: Options
newtypeOptions = customDefaultOptions { unwrapUnaryRecords @Options = True }
  • 移除DuplicateRecordFields扩展:如果你的项目不需要让不同类型共享同名字段,直接去掉这个编译选项,字段选择器会和Options类型绑定,自然就不会有歧义了。

内容的提问来源于stack exchange,提问作者JH de Raigniac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:05:27