Haskell 将类型级别的可选自然数(可能是Nat)与值关联

Haskell 将类型级别的可选自然数(可能是Nat)与值关联,haskell,type-level-computation,Haskell,Type Level Computation,该函数将类型级别的natural与整数值关联。使用数据类型,类型应用程序语言扩展 {-#语言数据类型} {-#语言类型应用程序{-} 模块Derp在哪里 导入数据代理(代理(..) 导入GHC.TypeLits(natVal) foo::整数 foo=natVal(代理服务器@1337) 人们如何将一个'可能是Nat与一个值相关联?e、 g.a可能是整数 foo2 :: Maybe Integer foo2 = maybeNatVal (Proxy @(Just 1337)) 这就是单身包的

该函数将类型级别的natural与
整数
值关联。使用
数据类型
类型应用程序
语言扩展

{-#语言数据类型}
{-#语言类型应用程序{-}
模块Derp在哪里
导入数据代理(代理(..)
导入GHC.TypeLits(natVal)
foo::整数
foo=natVal(代理服务器@1337)
人们如何将一个
'可能是Nat
与一个值相关联?e、 g.a
可能是整数

foo2 :: Maybe Integer
foo2 = maybeNatVal (Proxy @(Just 1337))

这就是单身包的作用。相关函数名为
降级
<代码>降级,专用于类型级别值(使用可见类型应用程序),等于相应的术语级别值

需要提及的一个区别是
Nat
降级为
Natural

{-#语言类型应用程序,数据类型}
导入数据。单例
导入Numeric.Natural(Natural)--base
也许是天然的
myexample=demote@('Just 1337)

我们通常用来将类型转换为值的东西是:类型类

class MaybeNatVal (v :: Maybe Nat) where
  maybeNatVal :: Proxy v -> Maybe Integer
instance MaybeNatVal Nothing where
  maybeNatVal _ = Nothing
instance KnownNat n => MaybeNatVal (Just n) where
  maybeNatVal x = Just $ natVal $ unJust x
    where unJust :: Proxy (Just n) -> Proxy (n :: Nat)
          unJust _ = Proxy
在另一个答案中建议的库做同样的事情,除了typeclass是多态的,并且实例是由模板Haskell生成的