在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.
考虑下面的代码片段,记住Aaa
和Bbb
来自外部库,来自同一个模块:
{-# 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
1条答案
按热度按时间cqoc49vn1#
我也遇到过和你类似的情况,最后,我发现
OverloadedRecordDot
可以做到这一点。