导出重复的记录字段

5

使用-XDuplicateRecordFields,允许以下操作:

{-# LANGUAGE DuplicateRecordFields #-}

module Baz(Foo(..), Bar(..)) where
data Foo = Foo {qux :: Int}    
data Bar = Bar {qux :: String}

然而,当Foo定义在一个名为Foo的模块中,而Bar定义在一个名为Bar的模块中时,我会得到一个编译错误:

{-# LANGUAGE DuplicateRecordFields #-}

module Baz(Foo(..), Bar(..)) where
import Foo (Foo(..))
import Bar (Bar(..))

Conflicting exports for ‘qux’

我认为我正在尝试做的事情相当于第一个示例; 原始定义数据类型的位置不应该有影响。 GHC 8是否支持这种情况?


2
这很可能是一个错误,您应该报告 - Joachim Breitner
1
这可能是实现的限制。通常需要此扩展,因为您想在同一模块中定义两个同名字段。在不同的模块中这样做已经可以,因为可以使用限定导入进行消歧义。可能像上面那种情况的其他情况只是 GHC 开发人员没有考虑到。 - chi
1个回答

2

我在这里提交了一个bug。然而,我也偶然发现了一个解决方法:

如果我把pragma放在Foo.hs或Bar.hs中的任意一个文件中,GHC就会接受这个程序。也就是说,以下内容可以编译:

{-# LANGUAGE DuplicateRecordFields #-}
module Foo(Foo(..)) where
data Foo = Foo {qux::Int}

module Bar(Bar(..)) where
data Bar = Bar {qux::String}

module Baz(Foo(..),Bar(..)) where
import Foo (Foo(..))
import Bar (Bar(..))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接