С помощью Хаммара Я сделал шаблон 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 таким способом, который был бы столь же сложным ...
У кого-нибудь есть мысли о том, как лучше всего это сделать?