2016-01-31 39 views
0

在Haskell問題:弗雷格是否解決了Haskell「再出口合格」的問題?

module Foo.A where 

foo = 42 

module Foo.B where 

foo = 12 

,你想寫一個超級模塊

module Foo (
     module Foo.A 
    , module Foo.B 
    ) where 

import Foo.A 
import Foo.B 

其重新出口這些模塊,你會得到一個名稱衝突。

注意,可以有充足的的功能,如foo每個模塊中(foo1,foo2的,等等),我想從兩個模塊中使用它們。畢竟,在每個模塊中也可以有data s,它們具有相同的成員名稱。所以隱藏不是一個解決方案。 我做考慮鏡頭解決它。

現在,不弗雷格解決哈斯克爾的「再出口合格」的問題呢?如果我沒有記錯的話,看起來確實如此,但我現在找不到證據,任何人都可以詳細說明這一點?

回答

3

我想不會。在Frege中,模塊只能重新導出項目(即函數,類型,類型類),但不能重新導出項目。

這意味着,如果您正在導入的模塊層次結構中存在一些foo,您仍然需要隱藏所有但最多一個。

你能在弗雷格做的是:

import mod.A(foo fooA) 
import mod.B(foo fooB) 

從而有效地重新命名進口模塊A.foofooAB.foofooB。這也適用於再出口。例如,在frege.Prelude我們有

import Prelude.PreludeBase public(!= /=) 

這將使任何人誰進口frege.Prelude有運營商/=可用。但這僅僅是爲!=運營商的Ord

正如人們可以想像,我們需要有兩個!=/=爲了避免投訴形成Java或哈斯克爾陣營,分別別名。