gpt4 book ai didi

haskell - 我可以导出构造函数和类型别名吗?

转载 作者:行者123 更新时间:2023-12-02 17:53:58 27 4
gpt4 key购买 nike

我有一个数据类型 data Foo a b = Bar a b,我在库内部使用它。

我还有一个更常见的具体形式的别名:type Bar = Foo Int Int

有没有办法从我的库中导出 Bar 类型,而不是 Foo 类型?

我想做:

module Quux (
Bar(Bar)
) where

但是当我尝试这样做时,我收到错误:

The export item ‘Bar(Bar)’
attempts to export constructors or class methods that are not visible here

下面的代码可以工作,但我根本不想导出 Foo 类型:

module Quux (
Bar
, Foo(..)
) where

最佳答案

这在 Haskell 2010 中不可能,但在 GHC 中可能

在 Haskell 2010 中,您只能将构造函数导出为数据类型的一部分:

Data constructors cannot be named in export lists except as subordinate names [the Cᵢ in T(C₁,C₂)], because they cannot otherwise be distinguished from type constructors. [Haskell 2010 Report, §5.2 "Export Lists", #2]

在 GHC ( version 7.8 or later ) 中,您可以使用 PatternSynonyms 语言扩展来实现此目的:打开该扩展后,您可以限定导出列表中的构造函数与模式。因此,例如,您想要的示例是

{-# LANGUAGE PatternSynonyms #-}

module Quux (Bar, pattern Bar) where

data Foo a b = Bar a b
type Bar = Foo Int Int

导出列表中的pattern Bar指定构造函数,未修饰的Bar指定类型同义词。

此外,如果您认为朴素的 Bar 令人困惑/不明确,您可以使用 ExplicitNamespaces 扩展(在 7.6 或更高版本中)为类型构造函数添加前缀类型,类似:

{-# LANGUAGE ExplicitNamespaces, PatternSynonyms #-}

module Quux (type Bar, pattern Bar) where

data Foo a b = Bar a b
type Bar = Foo Int Int

来自文档,关于使用 pattern 导出构造函数:

[W]ith -XPatternSynonyms you can prefix the name of a data constructor in an import or export list with the keyword pattern, to allow the import or export of a data constructor without its parent type constructor [GHC 7.10 Users Manual, §7.3.26.4 "Explicit namespaces in import/export"]

You may also use the pattern keyword in an import/export specification to import or export an ordinary data constructor. For example:

import Data.Maybe( pattern Just )

would bring into scope the data constructor Just from the Maybe type, without also bringing the type constructor Maybe into scope. [GHC 7.10 Users Manual, §7.3.9.2 "Import and export of pattern synonyms"]

另外,对于使用 type 导出类型:

The -XExplicitNamespaces extension allows you to prefix the name of a type constructor in an import or export list with "type" to disambiguate… [GHC 7.10 Users Manual, §7.3.26.4 "Explicit namespaces in import/export"]

<小时/>

也就是说,我倾向于同意 dfeuer这里——报告不允许这样做是有原因的。无法写下来的类型签名 - 例如,Bar::a -> b -> Quux.Foo a b - 有点令人抓狂。但类型同义词确实有帮助;只需确保您的文档完整即可:-)

关于haskell - 我可以导出构造函数和类型别名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35616041/

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