导入数据构造函数而不导入类型

Exp*_* HP 8 import haskell

numeric-prelude做这个事情,每个数据类型都被命名T,每个类类都被命名C.为了......一致性,我想我会一起玩:

{-# LANGUAGE NoImplicitPrelude #-}
module Number.SqrtRatio (T(..), ratioPart) where

import qualified Number.Ratio as Ratio
import Number.Ratio ((:%))

import qualified Algebra.Ring as Ring
import NumericPrelude.Base

-- | A number whose square is rational, canonicalized as a rational
--   times the square root of a squarefree integer.
data T x = T {
    numerator :: !x,
    denominator :: !x,
    rootNum :: !x
    } deriving (Eq, Show)

ratioPart :: T x -> Ratio.T x
ratioPart (T n d _) = n :% d

fromRatio :: (Ring.C x) => Ratio.T x -> T x
fromRatio (n :% d) = T n d Ring.one
Run Code Online (Sandbox Code Playgroud)

ghc 没有留下深刻的印象:

Number/SqrtRatio.hs:5:22:
    In module ‘Number.Ratio’:
      ‘(:%)’ is a data constructor of ‘T’
    To import it use
      ‘import’ Number.Ratio( T( (:%) ) )
    or
      ‘import’ Number.Ratio( T(..) )
Run Code Online (Sandbox Code Playgroud)

当然,伙计,我可以遵守:

{-# LANGUAGE NoImplicitPrelude #-}
module Number.SqrtRatio (T, ratioPart) where

import qualified Number.Ratio as Ratio
import Number.Ratio (T((:%)))
--       newly added ^
Run Code Online (Sandbox Code Playgroud)

...但这也最终导入Ratio.T,这与我的冲突T!

ratioPart :: T x -> Ratio.T x
{-           ^-- Ambiguous occurrence ‘T’
    It could refer to either ‘Number.SqrtRatio.T’,
                             defined at Number/SqrtRatio.hs:11:1
                          or ‘Number.Ratio.T’,
                             imported from ‘Number.Ratio’ at Number/SqrtRatio.hs:5:22-28
-}
Run Code Online (Sandbox Code Playgroud)

好吧,那怎么样import Number.Ratio (T((:%))) hiding T

Number/SqrtRatio.hs:5:31: parse error on input ‘hiding’
Run Code Online (Sandbox Code Playgroud)

我有点失落,ga.:/

lef*_*out 8

原来还有就是做这个正确的方法:

{-# LANGUAGE NoImplicitPrelude, PatternSynonyms #-}
module Number.SqrtRatio (T(..), ratioPart) where

import qualified Number.Ratio as Ratio
import Number.Ratio (pattern (:%))
Run Code Online (Sandbox Code Playgroud)

请注意,我使用-XPatternSynonyms扩展名不是为了实际定义任何模式同义词,只是为了启用pattern关键字,所以我很清楚我想单独导入值构造函数 :%.