2016-05-23 14 views
6

In GHC 8:Come disambiguare la funzione selettore?

{-# LANGUAGE DuplicateRecordFields #-} 

data Dog = Dog { name::String } 
data Human = Human { name::String } 

dog = Dog "Spike" 


main = putStrLn $ name dog 

Questo codice non può essere compilato:

Ambiguous occurrence `name' 
It could refer to either the field `name', defined at A.hs:4:22 
         or the field `name', defined at A.hs:3:18 

Come recuperare correttamente il nome del mio cane?

+5

Ah, campi di record ambigui ... chiedo se la catena di estensioni di kludgy fix è infinita? Se sì, avremo bisogno di un 'DisambiguateRecordFieldsDisambiguationExte nsione? estensione? - ... Assicuratevi di controllare [la libreria 'records' di Nikita Volkov] (https://nikita-volkov.github.io/record/), che dovrebbe rendere completamente inutili queste estensioni. - (FTR: Non penso che gli autori di queste estensioni stiano facendo un brutto lavoro, infatti ho usato 'RecordWildCards' in passato e ho trovato che funziona ragionevolmente bene, tuttavia, credo che nel complesso non sia l'approccio giusto .) – leftaroundabout

risposta

6

questo dovrebbe funzionare:

main = putStrLn $ name (dog :: Dog) 

vedi DuplicateRecordFields per ulteriori dettagli:

usi nudi di campo riferiscono solo alla funzione del selettore, e funziona solo se questo è ambigua.

e

Tuttavia, non dedurre il tipo dell'argomento per determinare il tipo di dati, o hanno alcun modo di differire la scelta del risolutore vincolo.

L'esempio c'è molto come la tua:

bad (p :: Person) = personId p

questo non funzionerà quando v'è un altro record con un campo personId di portata - anche se sembra essere ovvio :(

+3

Aspetta, ma GHC non è già ora che 'dog' ha tipo' Cane'? – ZhekaKozlov

+0

vedere la citazione ... hai ragione, ma non è così che funziona/viene dedotto - se usi firme che di solito non è un problema – Carsten

+1

oh credo che questa estensione LANGUAGE sarà una delle mie preferite! – epsilonhalbe

Problemi correlati