gpt4 book ai didi

haskell - 使用 Haskell 使用相同的源代码构建两个不同的模块

转载 作者:行者123 更新时间:2023-12-02 12:29:01 24 4
gpt4 key购买 nike

我正在用 Haskell 编写一个模块,我想创建该模块的两个版本:

  • “基本”一个(名为 MyLib):用于速度和公开发布。
  • “扩展”版本(名为 MyLibExt):供专家和私有(private)使用。

为了方便起见,我希望这两个模块(具有两个不同的名称)共享相同的源文件。这两个模块将具有相同的类型和相同的功能,但存在一些差异(“扩展”版本将依赖于“基本”版本)。

我的想法是拥有这样的东西:

module MyLib where  -- for 'basic' version

module MyLibExt where -- for 'extended' version

MyType =
TypeA -- for 'basic' version
| TypeB -- for 'basic' version
| TypeC -- for 'basic' version

| TypeExtendedD -- for 'extended' version
| TypeExtendedE -- for 'extended' version


MyFunction TypeA = ... -- for 'basic' version
MyFunction TypeB = ... -- for 'basic' version

MyFunction TypeExtendedD = ... -- for 'extended' version

并使用给 GHC/Cabal 的一些编译指令构建两个模块。

用 Haskell 可以做这样的事情吗?

哪些 GHC/Cabal 编译指令可用于进行条件构建?

最佳答案

不能将两个模块放在同一个文件中。但您可以通过一些重新导出来获得您想要的东西。

一个文件将同时包含基本代码和扩展代码(我稍微缩短了它):

module MyLibExt where

MyType = TypeA | TypeB | TypeC | TypeExtendedD | TypeExtendedE

myFunction TypeA = ...
myFunction TypeB = ...
myFunction TypeExtendedD = ...

那么另一个文件就是基本文件:

module MyLib (MyType (TypeA, TypeB, TypeC), myFunction)

import MyLibExt

这样,如果有人只导入 MyLib,他们只能访问基本构造函数,而不能访问扩展构造函数。 myFunction 仍然可以像在 MyLibExt 中一样处理 TypeExtendedD 值,但由于我们无法仅使用 MyLib 创建这些值,没问题。

更一般地,当您定义模块时,您可以说出您到底想要导出什么。以下是一些基本示例:

module Example (
exampleFunction, -- simply export this function.

ExampleType1 (), -- export the type, but no constructors.
ExampleType2 (ExampleConstructor1, ExampleConstructor2), -- export the given type and its given constructors. You can't export constructors like functions, you have to do it like this).
ExampleType3 (..), -- export given type and all its constructors.

ExampleClass1, -- export type class, but no functions that belong to it.
ExampleClass2 (exampleFunction2, exampleFunction3), -- export type class and the given functions belonging to it. You can also export these functions as though they were normal functions, like in the first of the examples.
ExampleClass3 (..), -- export type class and all its functions.

module Module1, -- re-export anything that is imported from Module1.
) where

您可以导出范围内的任何内容,包括从其他模块导入的任何内容。事实上,如果你想从其他模块中重新导出某些内容,你需要像这样显式定义一个导出列表,默认情况下它只会导出该模块中定义的任何内容。

关于haskell - 使用 Haskell 使用相同的源代码构建两个不同的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36754027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com