Пиша прост 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'
Има ли нещо, което да заобиколи това?