Я пишу простой 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'
Есть ли что-то, чтобы обойти это?