在hammar 的帮助下,我制作了一个模板 Haskell 位,它可以编译
$(zModP 5)
到
newtype Z5 = Z5 Int
instance Additive.C Z5 where
(Z5 x) + (Z5 y) = Z5 $ (x + y) `mod` 5
...
我现在面临一个我认为我无法通过这种方式解决的问题。
关于多项式的一个显着事实是,如果它们在模某个素数上不可约,则它们在有理数中是不可约的p
。我已经有一种方法可以蛮力尝试在给定(有限)字段上分解多项式。
我想尝试为多个字段运行此功能。这是我想要的:
isIrreducible :: (FiniteField.C a) => Poly.T a -> Bool
isIrreducible p = ...
intPolyIrreducible :: Poly.T Int -> Bool
intPolyIrreducible p = isIrreducible (p :: Poly.T Z2) ||
isIrreducible (p :: Poly.T Z3) ||
isIrreducible (p :: Poly.T Z5) ||
...
基本上我想尝试为大量的“除法”定义运行我的分解算法。
我认为这可能与 TH 有关,但似乎需要永远。我想知道将我的算术运算作为参数传递给它是否更容易isIrreducible
?
或者,这似乎是 Newtype 模块可以提供帮助的东西,但我想不出如果不以同样困难的方式使用 TH 它将如何工作......
有人对如何最好地实现这一点有任何想法吗?