2016-07-14 38 views
2

我有一個模塊A和B,它們都輸出Event類型。模塊C定義了模塊A的Event的同義詞類型,將其稱爲InputEvent我可以在不使用ViewPatterns GHC擴展的情況下導入類型同義詞的數據構造函數嗎?

我再消耗模塊d兩個模塊B和模塊C:

module D where 

import B (Event) 
import C (InputEvent) 

但是,如果我嘗試導入InputEvent的類型構造器(比方說,MakeEvent),我得到的錯誤:

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

這可以通過使用ViewPatterns GHC延伸和從模塊C導出的別名MakeEvent解決:

makeEvent = MakeEvent 

但是,有沒有一種不使用ViewPatterns擴展來導入MakeEvent數據構造函數的方法?

+0

類型同義詞沒有構造函數,所以自然導入類型同義詞的構造函數將失敗。從導入它們的模塊導入構造函數:'import {B/C}(Event(MakeEvent))'。模式syns在這裏並沒有真正的幫助 - 'MakeEvent'構造函數會與'MakeEvent'模式衝突,所以你必須將它們導入合格。此外,您不需要任何這樣的別名 - 只需從模塊「C」重新導出'MakeEvent'即可。 – user2407038

+0

相關:http://stackoverflow.com/questions/35616041/can-i-export-constructors-along-with-a-type-alias –

回答

2

不要使用類型同義詞來強制抽象障礙,除非可能是小的私人類別。他們並不擅長。如果要隱藏Event,請使用新類型和模式同義詞。

+0

我不想隱藏'Event'。模塊C只是爲了方便而重新導出它(所以我不必使用合格的導入),因爲它的目的是允許模塊A和B互操作。我會很高興從模塊A中導出數據構造函數,除非我不能導出類​​型構造函數,這會導致模塊D中的模糊引用。也許最好的做法是廢棄類型別名並僅使用合格的導入。 –

+0

@CameronMartin,這聽起來對我來說是一個很好的計劃。如果您可以導入合格的類型但其構造函數不合格,那將會很好。事實上,您最好的選擇可能是一個合格的導入以及本地雙向模式同義詞。 – dfeuer

相關問題