2012-09-29 3 views
17

ハスケルでは、私はimport Fruitまたはimport Fruit (apple)と書いてあり、appleまたはFruit.appleにアクセスすることができます。ハスケルのエイリアスを持つ関数をインポートする

Pythonでは、Fruit.appleの場合、appleまたはimport Fruitの場合はfrom Fruit import appleと書くことができます。

bananaと同じ機能を参照するために、import Fruit.apple as bananaをPythonで書くこともできます。

どのように、ハスケルでこれを行うことができますか?いずれの言語のimport Fruit as VegetableでもFruitの名前を変更できますが、appleの名前を変更します。

+0

で、私は特によいいよリファクタリングなしでIntを取り除く。 –

+0

次の構文を受け入れるようにGHCを修正するのがどれほど簡単か難しいのだろうか?「フルーツ(リンゴをバナナとして)」。 – Wizek

答えて

17

これはPythonが持っている素敵なプロパティです。言い換えれば、その "辞書はすべて下がっている"ためです。 Haskellではモジュールにエイリアスを割り当てることができますが、 という別名をimport文からエイ​​リアスする方法はありません(私が知る限り)。あなたが行うことができるだろう最高の

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

あなたはこのすべての詳細を隠し、独自のモジュールでこれを入れて、必要な値をエクスポートすることができますが、それはそう単純なもののために多くの作業のように思えます。

以下にハマールによってコメントされているように、単相性の制限により、推測されたタイプ がbananaの問題を引き起こす可能性があります。安全のために、あなたはその目的のタイプ(appleのおそらく)でbananaに注釈を付ける、または

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

として単相性制限を無効にする必要がありますどちらかそうでない場合は、bananaの推論された型が望まれるよりも少ない多型である可能性があります。

単一相異制限は、各上位レベルの関数のタイプクラスの具体的なインスタンスを割り当てようとします(これは、パフォーマンス上の理由から行われます)。

example = return() 

この関数はタイプ Monad m => m()を持っていますが、単相性制限のために、モナドのインスタンスを使用すべきかについての十分な情報がないはずです、考えてみましょうあなたは

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() 

ここで、次のメッセージが表示されますので、あなたは、このような

example = return() 

main :: IO() 
main = example 

として、使用しているモナドのどのインスタンス推論するGHCのための十分な情報を提供する場合、その後、GHCはfolloを与えますウイングタイプ

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

あなたはexampleが直接そのための構文はありませんmain

+2

'banana = F.apple'ではないのですか? – Artyom

+0

@ArtyomKazakはい、それです! – sabauma

+8

これを行うときには単相性の制限に注意してください。そうでないと 'banana'は' apple'よりも制限の深い型に終わることがあります。 – hammar

7

と同じ型を持っていることを告げたからです。おそらくあなたはappleローカルに定義されたとの衝突を避けたいので、私は長さが取得するようData.List.genericLengthをインポートしようとしているこの瞬間にあなたの情報については

import qualified Fruit (apple) 
banana = Fruit.apple 
関連する問題