numeric-prelude
does this thing where every data type is named T
and every type-class is named C
. For the sake of... consistency, I suppose I'll play along:
{-# 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
ghc
is not impressed:
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(..) )
Sure thing buddy, I can comply:
{-# LANGUAGE NoImplicitPrelude #-}
module Number.SqrtRatio (T, ratioPart) where
import qualified Number.Ratio as Ratio
import Number.Ratio (T((:%)))
-- newly added ^
...but this also ends up importing Ratio.T
, which conflicts with my 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
-}
Alright, so how about import Number.Ratio (T((:%))) hiding T
?
Number/SqrtRatio.hs:5:31: parse error on input ‘hiding’
I'm at a bit of a loss, gaise. :/
Turns out there is a proper way to do this:
{-# LANGUAGE NoImplicitPrelude, PatternSynonyms #-}
module Number.SqrtRatio (T(..), ratioPart) where
import qualified Number.Ratio as Ratio
import Number.Ratio (pattern (:%))
Note that I've used the -XPatternSynonyms
extension not to actually define any pattern synonym, just to enable the pattern
keyword so it's clear I want to import the value constructor :%
alone.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With