我正在处理一些Haskell代码,我想定义一个采用两个KnownNat
并导致第二个KnownNat
的最小因数大于第一个的最小因数的类型。
例如,给定数字13
和100
,结果将是20
,因为20
干净地划分了100
,并且{{1 }}和13
清楚地将20
分开。给另一个示例100
和96
,结果将是10000
。
我想在Haskell中表达这一点的方法是以某种方式使用typelits包来计算它。但是我真的不知道怎么做。
100
任何帮助或指针都将受到赞赏!
答案 0 :(得分:4)
不要太难。提升到类型级别的标准试验划分算法似乎可以解决问题。
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
import GHC.TypeLits
type FactorGT a b = FactorGTRaw a b (CmpNat (Mod b a) 0)
type family FactorGTRaw a b v where
FactorGTRaw a b EQ = a
FactorGTRaw a b _ = FactorGT (a+1) b
在ghci中试用:
> :k! FactorGT 13 100
FactorGT 13 100 :: Nat
= 20
> :k! FactorGT 96 1000
FactorGT 96 1000 :: Nat
= 100