给定以下代码,为什么Haskell仅在到达第二个id时报告错误?

data TypeX = TypeX {
         id :: Int        -- why not the error here?
       , val :: String
       } deriving (Show)
var1 = TypeX 1 "bananas"
var2 = TypeX {
       val = "oranges"
     , id = 2              -- why an error here?
     }


错误是:

ghci> :l TypeX.lhs
[1 of 1] Compiling Main             ( TypeX.lhs, interpreted )

TypeX.lhs:8:13:
Ambiguous occurrence ‘id’
It could refer to either ‘Main.id’, defined at TypeX.lhs:2:15
                      or ‘Prelude.id’,
                         imported from ‘Prelude’ at TypeX.lhs:1:1
                         (and originally defined in ‘GHC.Base’)

最佳答案

即使定义记录字段与从另一个模块导入的内容发生名称冲突也不是错误。毕竟,您仍然可以通过显式为当前模块名称添加前缀来使用它:

var2 = TypeX {
       val = "oranges"
     , Main.id = 2              -- no more error
     }


还有一个语言扩展DisambiguateRecordFields,它使GHC在记录表示法中的字段名称方面略显聪明,并允许您的代码按原始编写。 (但是仍然不允许您为同一模块中的两种不同类型定义相同的字段名称。)

关于haskell - 奇怪的Haskell行为:记录语法中的错误位置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31506856/

10-11 04:21