Haskell 递归生成类型类约束,并在递归函数中使用它们

Haskell 递归生成类型类约束,并在递归函数中使用它们,haskell,Haskell,我试图定义一个函数,它以一些自然数n作为输入。根据此输入,函数应具有不同的约束。此约束通过类型族进行计算。该数字必须转换为GHC.TypeNats,因为约束条件适用于Data.Vector.Sized。我问了一个类似的问题,但是答案在GHC.TypeNats和任意n的情况下不起作用 我从中尝试了UNat类型 这是clash中的相关代码: {-#语言允许使用模糊类型} {-#语言CPP} {-#语言GADTs} {-#语言等级} {-#语言类型应用程序{-} {-#语言类型运算符{-} {-#语言

我试图定义一个函数,它以一些自然数
n
作为输入。根据此输入,函数应具有不同的约束。此约束通过类型族进行计算。该数字必须转换为
GHC.TypeNats
,因为约束条件适用于
Data.Vector.Sized
。我问了一个类似的问题,但是答案在
GHC.TypeNats
和任意
n
的情况下不起作用

我从中尝试了
UNat
类型

这是clash中的相关代码:

{-#语言允许使用模糊类型}
{-#语言CPP}
{-#语言GADTs}
{-#语言等级}
{-#语言类型应用程序{-}
{-#语言类型运算符{-}
{-#语言模板haskell}
{-#语言数据类型}
{-#语言签名{-}
{-#语言类型族{-}
{-#语言范围类型变量#-}
{-#语言不可判定实例}
{-#语言可信}
{-#选项#GHC-fplugin GHC.TypeLits.KnownNat.Solver#-}
{-#选项(GHC-fplugin GHC.TypeLits.Normalise#-}
导入GHC.TypeNats
进口天然气
导入不安全。强制(不安全强制)
导入数据。种类(约束)
数据SNat(n::Nat)其中
SNat::KnownNat n=>SNat n
数据无人值守::Nat->*其中
乌泽罗:无人值守0
USucc::UNat n->UNat(n+1)
snatToInteger::SNat n->Natural
斯纳托整数p@SNat=自然值p
图纳特:福尔。SNat n->UNat n
图纳特p@SNat=fromI@n(snattop整数)
哪里
弗罗米:福尔m。自然->无人值守m
fromI 0=不安全性@(UNat 0)@(UNat m)UZero
fromI n=unsafeceorce@(UNat((m-1)+1))@(UNat m)(USucc(fromI@(m-1)(n-1)))
这可以用递归解决问题,但不能用约束

下面是一个简单的例子:

类型族F(m::Nat)(n::Nat)::约束,其中
fm0=()

fmn=((0I)通过向GADT-Peano-nat的构造函数添加约束来解决这个问题

data CNat::Nat->Nat->*其中
塞罗:北卡罗来纳州,北卡罗莱纳州,北卡罗莱纳州,北卡罗莱纳州,北卡罗莱纳州,北卡罗莱纳州,北卡罗莱纳州,北卡罗莱纳州,北卡罗莱纳州,北卡罗莱纳州
CSucc::对于所有n m.(0()
hC=()
gC::forall n m.CNat n m->()->()
gC CZero uz=()
gC(CSucc s)ugc=s(hC@m)