haskell GHC 9.2中的Ambient记录字段警告

wfauudbj  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(115)

在GHC 8.10和9.0中,foo (a :: Aaa)足以消除我想使用哪个字段的歧义。从9.2开始,我现在得到一个警告(歧义字段):

The field ‘foo’ belonging to type Aaa is ambiguous.
    This will not be supported by -XDuplicateRecordFields in future releases of GHC.
    You can use explicit case analysis to resolve the ambiguity.

考虑下面的代码片段,记住AaaBbb来自外部库,来自同一个模块

{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE RecordWildCards #-}

data Aaa = Aaa { foo :: Int }
data Bbb = Bbb { foo :: String }

a :: Aaa
a = Aaa 5

func1 :: Int
func1 = foo (a :: Aaa)

func2 :: Int
func2 = case a of
    Aaa{..} -> foo

func3 :: Int
func3 = case a of
    a'@Aaa{} -> foo a'

func2是唯一的无警告解决方案。这真的是目前最好的方法吗?func3完全忽略了case分析(这和foo a一样,foo a不能编译)。
我用的是9.2.3

cqoc49vn

cqoc49vn1#

我也遇到过和你类似的情况,最后,我发现OverloadedRecordDot可以做到这一点。

{-# LANGUAGE OverloadedRecordDot #-}

func4 :: Int
func4 = a.foo

相关问题