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