23

Haskell ではorを書きimport Fruit、 orimport Fruit (apple) にアクセスできます。appleFruit.apple

Python では、from Fruit import appleforappleまたはimport Fruitforを記述できますFruit.apple

import Fruit.apple as bananaと同じ関数を参照するように Python で書くこともできると思いますbanana

Haskellでこれを行うにはどうすればよいですか? import Fruit as Vegetableいずれの言語でも Fruit の名前を変更できますが、apple の名前を変更したいと考えています。

4

2 に答える 2

23

これは、いわば「辞書がずっと下にある」ため、Python が持つ優れた特性です。Haskell ではモジュールにエイリアスを割り当てることができますが、ステートメントから関数をエイリアスする方法はありません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 ()

この関数は type を持つ必要がありますが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 が使用している Monad のインスタンスを推測するのに十分な情報を提供すると、次のようになります。

example = return ()

main :: IO ()
main = example

GHCは次の型を与える

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

exampleと同じタイプになると言ったのでmain

于 2012-09-29T19:50:54.147 に答える
7

それを直接行うための構文はありません。おそらく、ローカルで定義された との衝突を避けたいappleので、私は

import qualified Fruit (apple)
banana = Fruit.apple
于 2012-09-29T19:58:52.290 に答える