Я хотел бы иметь тип, который может содержать значения от 0 до n, где n живет на уровне типа.
Я пытался что-то вроде:
import GHC.TypeLits
import Data.Proxy
newtype FiniteNat n = FiniteNat { toInteger :: Integer }
smartConstructFiniteNat :: (KnownNat n) => Proxy n -> Integer -> Maybe (FiniteNat (Proxy n))
smartConstructFiniteNat pn i
| 0 <= i && i < n = Just (FiniteNat i)
| otherwise = Nothing
where n = natVal pn
который работает в основном, но он действительно не удовлетворяет каким-то образом. Существует ли "стандартное" решение или даже библиотека для достижения этого? Существует много суеты о зависимых типизированных списках, но я не смог найти что-то в этом роде. Кроме того, я предполагаю, что использование GHC.TypeLits
необходимо, потому что мой n
может принимать довольно большие значения, поэтому индуктивное определение, вероятно, будет очень медленным.