2016-07-14 28 views
2

Ich habe ein Modul A und B, die beide den Event Typ exportieren. Modul C definiert ein Typen-Synonym für Event von Modul A und ruft es InputEvent auf.Kann ich die Datenkonstruktoren eines Typ-Synonyms importieren, ohne die ViewPatterns GHC-Erweiterung zu verwenden?

ich dann verbrauchen beide Modul B und Modul C in einem Modul D:

module D where 

import B (Event) 
import C (InputEvent) 

Allerdings, wenn ich versuchen InputEvent ‚s Typkonstruktoren zu importieren (sagen wir, MakeEvent), erhalte ich die Fehlermeldung:

Module 
‘C’ 
does not export 
‘InputEvent(MakeEvent)’ 

dies durch Verwendung der ViewPatterns GHC Erweiterung gelöst werden kann, und eine Alias ​​MakeEvent von Modul C exportieren:

makeEvent = MakeEvent 

Gibt es jedoch eine Möglichkeit, den MakeEvent-Datenkonstruktor zu importieren, ohne die ViewPatterns-Erweiterung zu verwenden?

+0

Typ Synonyme haben keine Konstruktoren, so dass der Import der Konstruktoren eines Typ-Synonyms fehlschlägt. Importieren Sie die Konstruktoren von dem Modul, das sie exportiert: 'import {B/C} (Event (MakeEvent))'. Pattern-Syns helfen hier nicht wirklich - der 'MakeEvent'-Konstruktor würde mit dem' MakeEvent'-Muster kollidieren, also müssten Sie diese qualifiziert importieren. Außerdem brauchen Sie keine solchen Aliase - einfach 'MakeEvent' aus dem Modul' C' reexportieren. – user2407038

+0

Related: http://StackOverflow.com/Questions/35616041/Can-I-Export-Constructors-ALONG-With-Art-Alias ​​ –

Antwort

2

Verwenden Sie keine Typ-Synonyme, um Abstraktionsbarrieren zu erzwingen, außer möglicherweise kleine, private. Sie sind nicht gut darin. Wenn Sie Event ausblenden möchten, verwenden Sie einen newtype und Muster Synonyme.

+0

Ich möchte "Event" nicht ausblenden. Modul C exportiert es einfach aus Gründen der Bequemlichkeit (so dass ich keine qualifizierten Importe verwenden muss), da es den Zweck hat, Modul A und B zu interoperieren. Ich würde glücklich sein, nur die Datenkonstruktoren von Modul A zu exportieren, außer ich kann nicht, ohne den Typkonstruktor zu exportieren, der eine mehrdeutige Referenz in Modul D verursacht. Vielleicht ist das Beste, zu tun, den Typalias zu verschrotten und nur qualifizierte Importe zu verwenden. –

+0

@CameronMartin, das klingt für mich nach einem guten Plan. Es wäre schön, wenn Sie den Typ qualifiziert importieren könnten, aber seine Konstruktoren nicht qualifiziert. So wie es ist, ist Ihre beste Wette ein qualifizierter Import zusammen mit lokalen bidirektionalen Muster-Synonymen. – dfeuer