2013-07-17 3 views
1

Я пытаюсь использовать DisambiguateRecordFields, чтобы разрешить мне использовать одно и то же имя поля в разных записях, но я не могу заставить его работать. Например:Не удается получить DisambiguateRecordFields для работы

- Файл A.hs

{-# LANGUAGE DisambiguateRecordFields #-} 

module A where 

data ARec = ARec {nID :: Int, sDesc :: String} 

- Файл B.hs

{-# LANGUAGE DisambiguateRecordFields #-} 

module B where 

data BRec = BRec {nID :: Int, sProdCode :: String} 

- Файл Main.hs

{-# LANGUAGE DisambiguateRecordFields #-} 

module Main where 

import A 

import B 

zA = ARec 123 "Happy" 

zB = BRec 456 "Usually" 

main = putStrLn $ "zA's ID is " ++ show (nID zA) 

Если я пишу над тремя файлами и: загрузите Main в GHCi, он жалуется на столкновение на nID. Я думал, что это именно то, что DisambiguateRecordFields было разработано для преодоления.

Любая помощь будет оценена!

Спасибо, Ян.

ответ

0

DisambiguateRecordFields работает только в некоторых случаях, в то время как другие по-прежнему неоднозначны (или, по крайней мере, считаются неоднозначными, даже если это иногда не так). См. the relevant documentation, в частности «bad2» среди примеров.

+0

Спасибо за ответ, но я не вижу актуальности. В моем коде zA однозначно вводится как ARec с помощью конструктора. В bad2 k действительно двусмысленно. Кстати, проблема сохраняется, даже если я добавляю явные объявления типа zA :: ARec и zB :: BRec. – IanC

+0

Правда, но это часть в круглых скобках: все еще _considered_ неоднозначная. 'DisambiguateRecordFields' просто не обрабатывает этот случай. Есть некоторые предложения для дальнейших расширений, которые могут помочь в остальных случаях, хотя: http://ghc.haskell.org/trac/ghc/wiki/Records – chirlu

+0

Спасибо chirlu. Я думаю, что вы говорите, что это ограничение того, что в любом случае является расширением базового языка. Наверное, я разочарован тем, что это расширение делает очень мало; Я не думаю, что это поможет мне вообще в том, что я делаю. О, хорошо, мне лучше стандартизировать имена моих полей! – IanC

0

Кстати, DisambiguateRecordFields работает только при импорте из других модулей, как вы правильно это сделали. Таким образом, можно легко реимпорт только имя поля квалифицированы и использовать его там, где компилятор не может

{-# LANGUAGE DisambiguateRecordFields #-} 

module Main where 
import A 
import B 
import qualified A as A(nID) 

zA = ARec 123 "Happy" 
zB = BRec 456 "Usually" 

main = putStrLn $ "zA's ID is " ++ show (A.nID zA) 

других вхождений остались компилятор.

Смежные вопросы