这是课堂作业。
我要在ML evalxy poly x y
中实现一个函数,其中poly
是表示多项式的int list list
。内部列表中位置n
的术语和外部列表中的位置m
是x^n * y^m
的系数。例如,列表[[1],[0,~2,0,0,3],[],[],[],[],[~5,0,7]]
表示多项式1 - 2x + 3 * x^4 * y - 5 * y^6 + 7 * x^2 * y^6
。
函数evalxy
是使用给定的x和y值来评估给定的多项式。函数的类型为val evalxy = fn : int list list -> int -> int -> int
。一个例子是evalxy [[1],[0,~2,0,0,3],[],[],[],[],[~5,0,7]] ~1 1 = 8
。
我不允许定义任何其他顶级函数,我不允许使用let-expression,并且我不允许使用递归,除了map
,{{1} }和foldr
。这些也是我唯一允许使用的内置函数。
我认为我可以通过在外部列表上调用foldl
,在每个内部列表上调用map
来执行此操作,并且对于每个内部列表项,我将条目(系数)乘以x并且年。如果我将x和y计数器初始化为1,那么对于第一个条目(例如系数0和0),系数* 1 * 1将返回系数,这是指数为0的预期值。然后对于每次迭代外部列表我可以通过将计数器乘以提供的y值的结果来递增y计数器。例如,map
(对于y ^ 1,因为它已初始化为1),1 * y = y
(对于y ^ 2)。对于x计数器和内部列表也可以这样做。
我意识到这一点并不十分清楚。我得到的是,对于外部列表的第一次迭代,某个y计数器(比如y * y
)具有以下值:
ycounter
1
1 * y
问题是,我不知道如何维持这样的反击。我在这里走错了路吗?任何帮助表示赞赏。