Qual é a alternativa preferida para Fin de Idris em Haskell
Eu gostaria de ter um tipo que possa conter valores de 0 a n, onde n mora no nível de tipo.
Eu estava tentando algo como:
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
que funciona basicamente, mas não é realmente satisfatório de alguma forma. Existe uma solução "padrão" ou mesmo uma biblioteca para conseguir isso? Há muita confusão sobre o tamanho de uma lista com muitas digitações, mas não consegui encontrar algo exatamente para isso. Além disso - eu assumo o usoGHC.TypeLits
é necessário, porque meun
pode assumir valores bastante grandes, então a definição indutiva provavelmente seria muito lenta.