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
满足了我的需求。谢谢!)