haskell - 如何处理带有限定名称的丑陋中缀符号

标签 haskell module namespaces operators

我通常坚信在我编程的大多数语言中使用命名空间(限定模块名称),因为一眼就知道某个标识符来自哪里是非常好的。在 Haskell 中,还有一个额外的优点,可以避免与 Prelude 函数发生常见名称冲突。

但是,我觉得必须在中缀符号(或其他短的 DSL-y 标识符)上放置命名空间看起来非常奇怪,所以我很想重新导出值,如下所示:

import qualified Data.Sequence as Seq
(|>) = (Seq.|>)
(<|) = (Seq.<|)

现在困扰我的是

  • 手动重新导出值感觉就像无聊的样板文件。

  • 手动重新导出值会绕过现有的模块系统,并且似乎不适用于数据构造函数(可能还有我尚未遇到的其他事情)

    import qualified Data.Sequence as Seq
    (:>) = (Seq.:>)  --gives me a parse error:
                     --"Not in scope: data constructor `:>'"
    

如何协调中缀符号和命名空间?我应该放弃并学习命名所有内容吗?是否有关于命名空间和符号的已建立的 Haskell 最佳实践?

最佳答案

好吧,您可以做的一件事就是导入两次:

import Data.Sequence ((|>), (<|), ViewR ((:>)))
import qualified Data.Sequence as Seq

这只会导入 :> , |><|不合格,其他一切都合格。请注意,自 :>是一个数据构造函数,您还必须导入其数据类型 ( ViewR ),但您不必必须导入 ViewR 的其余部分的构造函数。

此外,如果您担心冲突,您应该适当隐藏运算符:

import Prelude hiding ((.))

如果您使用的是健全的库,则与 Prelude 冲突意味着该库函数旨在替换该 Prelude 函数(例如 Control.Category ),因此您想让它替换默认含义.

就最佳实践而言,我从未见过有人使用合格的运算符(operator),除非存在冲突或者他们在 GHCi。总而言之,即使考虑到知道操作符来自哪里的优势,它也会使代码的可读性大大降低。

关于haskell - 如何处理带有限定名称的丑陋中缀符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9043294/

相关文章:

haskell - 如何在 Haskell 中创建具有空构造函数的数据类型的值?

ruby - 在 Ruby 中创建模块变量

Python 数学模块的精妙之处

用于自动完成的 Python 类型推断

haskell - 生成 ByteString(或任何具有 ForeignPtr 组件的对象)的函数的纯度

haskell - 如何让 Haskell 的 TChan 像 Erlang 的消息队列一样延迟消息?

ruby-on-rails - Ruby (/rails?) 顶级命名空间

module - 是否可以确定哪个 Fortran 编译器生成了 ".mod"文件?

laravel - Deployer v4.2.1 fatal error "undefined function"带有开箱即用的官方认可的第 3 方配方

c++ - 为什么在全局范围和命名空间 std 中都定义了 size_t?