小编nic*_*ick的帖子

在Haskell中使用类型级自然重叠实例

为了处理某些网络协议,我一直在使用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)

haskell ghc type-level-computation

7
推荐指数
0
解决办法
125
查看次数

标签 统计

ghc ×1

haskell ×1

type-level-computation ×1