gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:10:22 25 4
gpt4 key购买 nike

我通常坚信在我编程的大多数语言中使用命名空间(限定模块名称),因为一眼就知道某个标识符来自哪里是非常好的。在 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/

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