2012-09-29 31 views
17

在Haskell中,我編寫import Fruitimport Fruit (apple),並且可以訪問appleFruit.apple在Haskell中導入具有別名的函數

在Python中,我可以編寫from Fruit import appleappleimport FruitFruit.apple

我想也可以在Python中編寫import Fruit.apple as banana來引用與banana相同的功能。

如何,在Haskell能做到這一點? import Fruit as Vegetable兩種語言都可以重命名Fruit,但是我想重命名蘋果。

+0

爲了您的信息,我特別在這一刻嘗試導入Data.List.genericLength的長度得到沒有重構就擺脫了Int。 –

+0

我不知道補丁GHC接受以下語法是多麼容易或很難:'導入水果(apple as banana)'。 – Wizek

回答

17

這是一個很好的屬性Python有,因爲它的「字典一路下跌,」可以這麼說。 哈斯克爾讓你的別名分配給模塊,但沒有辦法別名功能 從import語句(據我所知)。你將能夠做的最好的是

import qualified Fruit as F (apple) 
banana = F.apple 

你可以把這個自己的模塊中導出你想要的值,躲在這一切的細節,但是,似乎很多工作的東西這麼簡單。

正如Hammar評論的那樣,單態限制可能導致推斷類型 的banana的問題。爲了安全起見,您應該標註banana其所需的類型(可能是的apple),或禁用單態限制爲

{-# LANGUAGE NoMonomorphismRestriction #-} 
import qualified Fruit as F (apple) 
banana = F.apple 

否則,推斷出的類型的banana可能比期望的少多態。

的單態限制嘗試分配一種類型的類的具體實例爲每個頂級功能(這是出於性能原因完成)。考慮,

example = return() 

這個函數的類型應該是Monad m => m(),但由於單態的限制,沒有足夠的信息,哪些應該使用Monad的實例,因此您會收到以下消息現在

Ambiguous type variable `m0' in the constraint: 
    (Monad m0) arising from a use of `return' 
Possible cause: the monomorphism restriction applied to the following: 
    example :: m0() (bound at Test.hs:44:1) 
Probable fix: give these definition(s) an explicit type signature 
       or use -XNoMonomorphismRestriction 
In the expression: return() 
In an equation for `example': example = return() 

如果你提供足夠的信息GHC推斷您正在使用的單子的情況下,如

example = return() 

main :: IO() 
main = example 

然後GHC會給弗洛翼式

*Main> :t example 
example :: IO() 

,因爲你告訴它example將具有相同類型main

+2

不是「香蕉= F.apple」嗎? – Artyom

+0

@ArtyomKazak是的! – sabauma

+8

雖然這樣做時要小心單形態限制,否則'banana'最終可能會比'apple'更具限制性。 – hammar

7

有沒有直接的語法爲。想必你希望避免與本地定義apple的衝突,所以我會去與

import qualified Fruit (apple) 
banana = Fruit.apple