我在ATS

时间:2017-02-22 01:30:27

标签: functional-programming ats

我必须为学校做一项任务,包括使用foldleft查找列表的长度。我的问题在于foldleft的实现。我们得到了一些示例代码,使用foldleft将列表中的每个项目乘以x。

implement
list0_mult(xs) =
list0_foldleft<int><int>(xs, 1, lam(res, x) => res*x)

在第三行,是什么意思?我们必须使用length函数来处理任何数据类型,我假设这样做我可能需要更改其中一个或两个。

2 个答案:

答案 0 :(得分:2)

你的TA在这里。

list0_foldleft具有以下定义。 (你可以在作业中找到它。)

extern fun {res:t@ype}{a:t@ype} list0_foldleft
  (xs: list0 a, ini: res, fopr: (res, a) -<cloref1> res): res

这里,{res:t@ype}是表示返回值类型的第一个模板参数,{a:t@ype}是表示列表元素类型的第二个模板参数。对于fopr,其类型为(res, a) -<cloref1> res,它是一个带有resa类型的两个参数的闭包(函数+环境),并返回类型{{ 1}}。

在通话网站中,

res

第一个list0_foldleft<int><int>(xs, 1, lam(res, x) => res*x) 表示返回类型<int>res,第二个int表示列表元素的类型为<int>(这可能不是你想要的)。

我相信你可以从这里找出问题所在。

答案 1 :(得分:1)

我想我已经找到了自己问题的答案:

第一个引用foldleft要返回的数据类型,第二个引用foldleft正在处理的列表中的数据类型。对于foldright,第一个和第二个交换位置。