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.:/
原来还有就是做这个正确的方法:
{-# 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关键字,所以我很清楚我想单独导入值构造函数 :%.