给定类型级别的起始KnownNat,找出KnownNat的下一个因子

时间:2019-06-03 20:46:00

标签: haskell type-level-computation

我正在处理一些Haskell代码,我想定义一个采用两个KnownNat并导致第二个KnownNat的最小因数大于第一个的最小因数的类型。

例如,给定数字13100,结果将是20,因为20干净地划分了100,并且{{1 }}和13清楚地将20分开。给另一个示例10096,结果将是10000

我想在Haskell中表达这一点的方法是以某种方式使用typelits包来计算它。但是我真的不知道怎么做。

100

任何帮助或指针都将受到赞赏!

1 个答案:

答案 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