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.

questionAnswers(2)

yourAnswerToTheQuestion