Haskell 从数据中使用SNat。与其他Sing实例一样使用单例?

Haskell 从数据中使用SNat。与其他Sing实例一样使用单例?,haskell,pattern-matching,singleton-type,Haskell,Pattern Matching,Singleton Type,我可以使用SomeSing来动态生成单例,然后对它们进行模式匹配,从而能够做有趣的事情 > let x = SomeSing SFalse :: SomeSing ('KProxy :: KProxy Bool) -- pretend x is dynamically generated using IO or something > case x of SomeSing SFalse -> blah blah SomeSing STrue ->

我可以使用
SomeSing
来动态生成单例,然后对它们进行模式匹配,从而能够做有趣的事情

> let x = SomeSing SFalse :: SomeSing ('KProxy :: KProxy Bool)
-- pretend x is dynamically generated using IO or something
> case x of SomeSing SFalse -> blah blah
            SomeSing STrue -> blah blah
但是,我不确定如何使用
SNat
,它是
Sing Nat
的数据族实例。我遇到的一个问题是,即使导入所有相关模块(
data.singleton
data.singleton.TypeLits
data.singleton.TypeLits
data.singleton.Prelude
,等等)并启用扩展,我也无法在范围内获得
SNat
数据构造函数(即使
SNat
构造函数在我使用
:浏览
:我唱歌时出现)


…我的另一个问题是…没有任何单独的构造函数可以匹配,比如
SFalse
STrue
…只有一个构造函数!:O我该如何以相同的方式使用它?

我相信问题是有两种自然数单态类型,都称为
SNat
。您需要的一种似乎已经找到了与GHC typelits一起使用的。它的构造函数不是从定义模块导出的,但它下面是一个
整数
。您可以访问该整数,但整个过程对于证明似乎几乎毫无用处。另一个
SNat
版本处理经典的Peano naturals。它可以用于证明,但将是运行时速度慢。我还没有看到Haskell natural在证明和速度方面都很好。

将任何单例放入存在包装器只会使其与原始类型同构(即,
somessing(KProxy::KProxy x)
中包含的值与
x
,如果单例构造正确的话)。当您记住一个单例与其父数据类型共享相同的结构,但在类型级别编码更多信息,并且
SomeSing
删除所有信息时,这一点应该很明显。长话短说:
SomeSing SNat
只是。@user2407038是的,我看到了……但是我如何从t获得
Natural
SomeSing
?我感兴趣的是访问
整数
…我不是用它来证明,我只是用它来动态初始化我的程序,它处理像
V n Double
,但总的来说是多态的
n
。我想从运行时得到
n
,比如I的结果O操作。@JustinL,在这种情况下,您需要添加类型级别的内容做什么?您可能需要使用最新版本的
reflection
@dfeur。看起来
reflection
满足了我的需求。谢谢!)