我想分别在Haskell中创建接口(类或实例)和实现文件,如下所示:
file1 :(对于界面)
class X where funcX1 = doFuncX1 funcX2 = doFuncX2 .... instance Y where funcY1 = doFuncY1 funcY2 = doFuncY2 ...
文件2 :(用于实施)
doFuncX1 = ... doFuncX2 = ... doFuncY1 = ... ...
如果必须在file2中导入file1,反之亦然,我该怎么做?
答案 0 :(得分:4)
在Haskell中你不需要任何这种麻烦的分离。只需在模块导出列表(module Foo ( X(..) ... ) where ...
)中标记您想要公开的内容,使用cabal构建项目,如果要导出库但不发布源代码,则只需发布{{ 1}}文件夹包含二进制接口文件和Haddock文档。这比讨厌更方便,例如需要手动保持同步的dist
和.h
个文件。
但是,当然,没有什么能阻止您将实现放在单独的非公共文件中。您只需要为此执行“反之亦然”导入,只是可能是具有必要数据类型声明的公共文件。 E.g。
.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 = ...
。