1

次のように、Haskell でインターフェイス (クラスまたはインスタンス) と実装ファイルを別々に作成したいと思います。

file1: (インターフェース用)

クラスXどこ
   funcX1 = doFuncX1
   funcX2 = doFuncX2
   ....

インスタンスY
   funcY1 = doFuncY1
   funcY2 = doFuncY2
   ...

ファイル 2: (実装用)

doFuncX1 = ...
doFuncX2 = ...
doFuncY1 = ...
...

file1 を file2 にインポートする必要がある場合、またはその逆を行うにはどうすればよいですか?

4

1 に答える 1

4

Haskell では、このような面倒な分離は必要ありません。モジュール エクスポート リスト ( ) で公開したいものだけをマークし、cabal でプロジェクトをビルドします。ライブラリをエクスポートしたいがソース コードをリリースしたくない場合は、バイナリ インターフェイス ファイルを含むフォルダーmodule Foo ( X(..) ... ) where ...のみを公開するだけで済みます。distハドックのドキュメント。.hこれは、厄介な例や、.cpp手動で同期を維持する必要があるファイルよりもはるかに便利です。

しかしもちろん、実装を別の非公開ファイルに入れることを妨げるものは何もありません。このために「逆の」インポートを行う必要はありません。おそらく、必要なデータ型宣言を含む共通ファイルのみが必要です。例えば

  • Public.hs:

    module Public(module Public.Datatypes) where
    
    import Public.Datatypes
    import Private.Implementations
    
    instance X Bar where { funcX1 = implFuncX1; ... }
    
  • Public/Datatypes.hs:

    module Public.Datatypes where
    
    data Bar = Bar { ... }
    class X bar where { funcX1 :: ... }
    
  • Private/Implementations.hs:

    module Private.Implementations(implFuncX1, ...) where
    
    import Public.Datatypes
    
    implFuncX1 :: ...
    implFuncX1 = ...
    

しかし、通常は単純にすべてを に入れる方がよいでしょうPublic.hs

于 2013-01-09T09:59:22.097 に答える