gpt4 book ai didi

haskell - 隐藏构造函数,但不隐藏导入时的类型

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

我有一个内部模块,我想为其提供外部 API

module Positive.Internal where

newtype Positive a = Positive { getPositive :: a }
deriving (Eq, Ord)

-- smart constructor
toPositive :: (Num a, Ord a) => a -> Maybe (Positive a)
toPositive a | a <= 0 = Nothing
| otherwise = Just $ Positive a
-- ...

我想隐藏愚蠢的构造函数,并将其替换为单向构造函数模式,以便用户仍然可以模式匹配值,他们只需要使用智能构造函数来使用新值。

由于我希望模式和哑构造函数使用相同的名称,因此我需要隐藏哑构造函数以防止命名空间冲突。

但是,由于哑构造函数和类型共享名称,因此导入除哑构造函数之外的所有内容都有点棘手。

目前我正在这样做,效果很好:

{-# LANGUAGE PatternSynonyms #-}
module Positive
( module Positive.Internal, pattern Positive
) where

import Positive.Internal (Positive())
import Positive.Internal hiding (Positive)
import qualified Positive.Internal as Internal

pattern Positive :: a -> Positive a
pattern Positive a <- Internal.Positive a

我可以通过使用合格的导入来简化我的导入,但我很好奇。

有没有办法在单个导入语句中导入除哑构造函数之外的所有Positive.Internal

我尝试隐藏 (Positive(Positive)),但这隐藏了类型和愚蠢的构造函数。我已经查过the wiki ,但我没有注意到任何方法可以区分隐藏列表中的构造函数和类型。

最佳答案

如果我错了,请纠正我,但我几乎可以肯定这就是您正在寻找的:

{-# LANGUAGE PatternSynonyms #-}
module Positive
( module Positive.Internal, pattern Positive, foo
) where

import Positive.Internal hiding (pattern Positive)
import qualified Positive.Internal as Internal (pattern Positive)

pattern Positive :: a -> Positive a
pattern Positive a <- Internal.Positive a

foo :: Positive Int
foo = Internal.Positive 5

Internal 模块与迄今为止定义的方式保持相同。举个例子:

module Negative where

import Positive

bar :: Maybe Int
bar = getPositive <$> toPositive 6

让我们在 GHCi 中仔细检查一下:

Prelude> :load Negative
[1 of 3] Compiling Positive.Internal ( Positive/Internal.hs, interpreted )
[2 of 3] Compiling Positive ( Positive.hs, interpreted )
[3 of 3] Compiling Negative ( Negative.hs, interpreted )
Ok, modules loaded: Negative, Positive, Positive.Internal.
*Negative> bar
Just 6
*Negative> getPositive foo
5
*Negative> :i Positive
newtype Positive a = Positive.Internal.Positive {getPositive :: a}
-- Defined at Positive/Internal.hs:3:1
instance [safe] Ord a => Ord (Positive a)
-- Defined at Positive/Internal.hs:4:17
instance [safe] Eq a => Eq (Positive a)
-- Defined at Positive/Internal.hs:4:13
*Negative> :t Positive

<interactive>:1:1: error:
• non-bidirectional pattern synonym ‘Positive’ used in an expression
• In the expression: Positive

关于haskell - 隐藏构造函数,但不隐藏导入时的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43614515/

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