【发布时间】:2020-01-11 18:25:31
【问题描述】:
我想在 Haskell 中为 Galois 字段编写一个库。伽罗瓦域由其不可约多项式定义。只有当它们具有相同的伽罗瓦域时,才能添加伽罗瓦域元素。我想将多项式提升为我的 Galois 域的类型,例如,具有多项式 [1, 2, 3] 的 Galois 域与具有多项式 [2, 0, 1] 的 Galois 域具有不同的类型。这样我可以确保只能添加具有相同 Galois 域的 Galois 域元素。这可能吗?
我的多项式数据类型如下所示:
newtype Polynomial a = Polynomial [a]
我的 Galois 字段数据类型如下所示:
data GF irr a = GF {
irreducible :: irr
, q :: PrimePower
}
所以我想要一个构造函数,它采用多项式(例如(Polynomial [2, 0, 1]))并给我一个GF (Polynomial Int) ([2, 0, 1]) 类型的Galois 字段。
我知道[2, 0, 1] 不是有效类型,但我看到Data.Singletons 可以创建类似
(SCons STrue (SCons SFalse SNil))
对于[True, False],但我不知道如何从我的列表[2, 0, 1] 中构造这些类型以及构造函数的外观。
【问题讨论】:
-
使用
DataKinds可以在类型级别使用列表。使用GHC.TypeLits,您可以在类型级别使用自然。你不能做的是适当的依赖类型,你可以根据你从用户那里得到的值来构造一个类型(至少在没有指定一个归纳方案的情况下)。 -
顺便说一下,Hackage 中有一个用于伽罗瓦域的库:hackage.haskell.org/package/galois-field