gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:04:24 24 4
gpt4 key购买 nike

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

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(..) )
<小时/>

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

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

import qualified Number.Ratio as Ratio
import Number.Ratio (T((:%)))
-- newly added ^

...但这最终也会导入 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
-}
<小时/>

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

Number/SqrtRatio.hs:5:31: parse error on input ‘hiding’

我有点不知所措,盖斯。 :/

最佳答案

事实证明执行此操作的正确方法:

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

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

请注意,我使用 -XPatternSynonyms 扩展并不是为了实际定义任何模式同义词,只是为了启用 pattern 关键字,因此很明显我想导入 < em>值构造函数 :% 单独。

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

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