我正在为网格轴编写一个简单的 ADT。在我的应用程序中,网格可能是规则的(坐标之间有恒定的步长),也可能是不规则的(否则)。当然,规则网格只是不规则网格的一种特殊情况,但在某些情况下(例如,执行一些优化)可能值得区分它们。所以,我声明我的 ADT 如下:
data GridAxis = RegularAxis (Float, Float) Float -- (min, max) delta
| IrregularAxis [Float] -- [xs]
但我不希望用户使用max < min
或使用无序xs
列表创建格式错误的轴。因此,我添加了执行一些基本检查的“更智能”的构造函数:
regularAxis :: (Float, Float) -> Float -> GridAxis
regularAxis (a, b) dx = RegularAxis (min a b, max a b) (abs dx)
irregularAxis :: [Float] -> GridAxis
irregularAxis xs = IrregularAxis (sort xs)
我不希望用户直接创建网格,所以我不将GridAxis
数据构造函数添加到模块导出列表中:
module GridAxis (
GridAxis,
regularAxis,
irregularAxis,
) where
但事实证明,完成此操作后,我不能再使用模式匹配GridAxis
了。尝试使用它
import qualified GridAxis as GA
test :: GA.GridAxis -> Bool
test axis = case axis of
GA.RegularAxis -> True
GA.IrregularAxis -> False
给出以下编译器错误:
src/Physics/ImplicitEMC.hs:7:15:
Not in scope: data constructor `GA.RegularAxis'
src/Physics/ImplicitEMC.hs:8:15:
Not in scope: data constructor `GA.IrregularAxis'
有什么可以解决的吗?