为了处理某些网络协议,我一直在使用GHC.TypeLits固定大小的位向量作为带有类型类型的包装整数Nat.
newtype W (n :: Nat) = W { getW :: Integer }
Run Code Online (Sandbox Code Playgroud)
除了各种类的实例(Integral,Num,Bits等)之外,我还定义了一个函数来组合它们:
(>+<) :: forall n m. (KnownNat m, KnownNat n, KnownNat (m + n)) => W m -> W n -> W (m + n)
(W x) >+< (W y) = fromInteger $ x + shift y (natValInt (Proxy :: Proxy m))
Run Code Online (Sandbox Code Playgroud)
下一部分是我遇到麻烦的地方.我试图创建一个应用程序,导致W n一个导致a W m,其中m是除数的一个n.例如,使用attoparsec,应该可以写:
anyWord128 :: Parser (W 128)
anyWord128 = assemble $ fmap …Run Code Online (Sandbox Code Playgroud)