2017-02-22 10 views
3

私はこのコードHaskellにサブモジュールを置くことは可能ですか?

module M where 

a = 1 
b = 2 
x = 10 
y = 20 

を持っている...しかし、モジュールが大きくなるにつれて、それは名前の重複に対処することは困難です。

このような名前空間を使用することはできますか?

module M where 
    module A where 
    a = 1 
    b = 2 

    module X where 
    x = 10 
    y = 20 

..andその後、

... 
import M 

s = A.a + X.y 
+0

'モジュールA.Bはどこですか? –

+0

出血性GHCの進行中の研究である[backpack](http://blog.ezyang.com/2016/10/try-backpack-ghc-backpack/)も参照してください。 – luqui

+1

私はいくつかのレコードを定義するモジュールを持っています。名前の衝突を避けるため、サブモジュールのレコードをグループ化することができると思いました – vidi

答えて

9

あなたが提案すると、現在Haskellの私の知る限りではサポートされていません。つまり、名前空間のようなモジュールを作成することを止めるものはありません。たとえば:

module Top where 

myTopFunc :: a -> Int 
myTopFunc _ = 1 

、別のファイルに:これに加えて

module Top.Sub where 

mySubFunc :: a -> String 
mySubFunc _ = "Haskell" 

、あなたのモジュールを配置するあなたの袖をさらにいくつかのトリックを持っています。モジュールAをBにインポートすると、Aの表示されているエンティティをBのように独自のものとしてエクスポートすることができます。その後、Bをインポートすると、元々どこから来たのか分からない関数/データ型などを使用することができます。上からモジュールを使用して、この例は次のようになります。

module Top (
    myTopFunc, 
    TS.mySubFunc 
) where 

import qualified Top.Sub as TS 

myTopFunc :: a -> Int 
myTopFunc _ = 1 

今、あなただけのTopをインポートすることで、両方の機能を使用することができます。

import Top (myTopFunc, mySubFunc) 
+1

2番目の例は、元のpseuo-Haskellについて考えることができる最も近い翻訳です。 'M'は 'M.Core'などとなり、' A'/'B'-' M.A'/'M.B'と新しいモジュール' M'はすべての定義を単純に再エクスポートします。 – user2407038

4

は、階層モジュールがあります。 MM.AM.Xのモジュールをネストすることはできませんが、Mはその言語に関する限りM.Aとは無関係です。

あなたはMは、あなたが明示的にこれをしなければならないすべてのものM.AM.X輸出、エクスポートする場合:

module M (module M.A, module M.X) where 
import M.A 
import M.X 
-- rest of M 
1

ありませんあなたはできませんが。しかし、あなたのコメントには、名前の衝突を避ける方法を探しているだけだと言われています。このために、{-# LANGUAGE DuplicateRecordFields #-}拡張子を使用すると、コンパイラは重複するレコードフィールド名を許可します。

+0

私はこの拡張機能を知っていますが、私がmakeLensesで自分のレコード用のレンズを生成している場合は動作しません。 – vidi

+0

@vidiええ、私は同じ問題を同時に遭遇しました。実際、かなり限られています。 PureScriptは、通常のレコードタイプのものをサポートしているようです。 HaskellがWebサービスを実装する初心者として、私はPureScriptをもう少し調べるかもしれないと思います。 –

関連する問題