История изменений
Исправление hateyoufeel, (текущая версия) :
Вот тебе пример небольшой. Нужен пакет typenums.
newtype RangedInt min max = RangedInt Int
deriving (...)
mkRangedInt :: (KnownInt min, KnownInt max, min <= max ~ True) => Int -> Maybe (RangedInt min max)
mkRangedInt i
| i >= minValue && <= maxValue = Just (RangedInt i)
| otherwise = Nothing
where
minValue = fromInteger (intVal @(Proxy min) Proxy)
maxValue = fromInteger (intVal @(Proxy max) Proxy)
И дальше у тебя будет тип, например, RangedInt 1 10
, где значения будут гарантировано между 1 и 10. Наверняка это даже уже где-то реализовано в какой-то библиотеке, но я не смотрел.
Исправление hateyoufeel, :
Вот тебе пример небольшой. Нужен пакет typenums.
newtype RangedInt min max = RangedInt Int
deriving (...)
mkRangedInt :: (KnownInt min, KnownInt max) => Int -> Maybe (RangedInt min max)
mkRangedInt i
| i >= minValue && <= maxValue = Just (RangedInt i)
| otherwise = Nothing
where
minValue = fromInteger (intVal @(Proxy min) Proxy)
maxValue = fromInteger (intVal @(Proxy max) Proxy)
И дальше у тебя будет тип, например, RangedInt 1 10
, где значения будут гарантировано между 1 и 10. Наверняка это даже уже где-то реализовано в какой-то библиотеке, но я не смотрел.
Исправление hateyoufeel, :
Вот тебе пример небольшой. Нужен пакет typenums.
newtype RangedInt min max = RangedInt Int
deriving (...)
mkRangedInt :: (KnownInt min, KnownInt max) => Int -> Maybe (RangedInt min max)
mkRangedInt i
| i >= minValue && <= maxValue = Just (RangedInt i)
| otherwise = Nothing
where
minValue = fromInteger (intVal @(Proxy min) Proxy)
maxValue = fromInteger (intVal @(Proxy max) Proxy)
И дальше у тебя будет тип, например, RangedInt 1 10
, где значения будут гарантировано между 1 и 10.
Исходная версия hateyoufeel, :
Вот тебе пример небольшой. Нужен пакет typenums.
newtype RangedInt min max = RangedInt Int
deriving (...)
mkRangedInt :: (KnownInt min, KnownInt max) => Int -> Maybe (RangedInt min max)
mkRangedInt i
| i >= minValue && <= maxValue = Just (RangedInt i)
| otherwise = Nothing
where
minValue = fromInteger (intVal @(Proxy min) Proxy)
maxValue = fromInteger (intVal @(Proxy max) Proxy)