LINUX.ORG.RU

История изменений

Исправление 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)