我试图得到两个多项式除法余数的int list
个系数。我一直在尝试使用mod
Polynomial.thy
对int poly
类型的两个多项式进行处理。但是,我收到了错误:
Type unification failed: No type arity int :: field
我的功能是:
fun testFunc :: "int poly ⇒ int poly ⇒ int list"
where
"testFunc p q = int_list (coeffs (p mod q))"
int_list
只需通过对每个元素进行拼接,将一个实数列表转换为一个整数列表:
fun int_list :: "real list ⇒ int list"
where
"int_list [] = []" |
"int_list lst = [floor (hd lst)] @ int_list (tl lst)"
当我将我的函数定义为:
时,这是有效的fun testFunc :: "'a::field poly ⇒ 'a poly ⇒ int list"
where
"testFunc p q = int_list (coeffs (p mod q))"
但是,传递给函数的两个参数特别是类型int poly
。如果我使用第二个定义传入两个多项式'a::field poly
和'a poly
,则返回'a list
,我无法运行我的int_list函数。
如果我将int_list
的签名更改为'a list => int list
,那么我必须对每个元素使用int_of
,这最终不会评估列表中的整数。 (即我得到类似[int_of 2, int_of 3]
而非[2, 3]
的内容,当我尝试对这些列表执行某些操作时,会使用int_of x
表达式返回,而不是评估)
是否有可能得到两个多项式模数的int list
个系数?
答案 0 :(得分:1)
floor
函数需要一个已被实例化为类floor_ceiling
(Archimedean_Field.thy#l140)的类型。
所以,我使用int_list
:
'a::floor_ceiling
尽可能通用
fun int_list :: "'a::{floor_ceiling} list => int list" where
"int_list [] = []" |
"int_list lst = [floor (hd lst)] @ int_list (tl lst)"
已为类poly
实例化了ring_div
类型,它为mod
函数提供了'a::field
函数,但仅适用于testFunc
(Polynomial.thy#l1467)。
由于int_list
使用testFunc
,我使用'a::{field,floor_ceiling}
使fun testFunc :: "'a::{field,floor_ceiling} poly => 'a poly => int list"
where
"testFunc p q = int_list (coeffs (p mod q))"
value "testFunc ([:1,2,3:]::real poly) ([:5,6,7:]::real poly)"
(*OUTPUT: "[- (2::int), - (1::int)]" :: "int list" *)
尽可能一般:
declare[[show_sorts, show_consts]]
print_classes
(*At 'class ring_div', it shows ' poly :: (field) ring_div'.*)
print_dependencies floor_ceiling
print_dependencies ring_div
一些信息命令:
{{1}}