我必须为学校做一项任务,包括使用foldleft查找列表的长度。我的问题在于foldleft的实现。我们得到了一些示例代码,使用foldleft将列表中的每个项目乘以x。
implement
list0_mult(xs) =
list0_foldleft<int><int>(xs, 1, lam(res, x) => res*x)
在第三行,是什么意思?我们必须使用length函数来处理任何数据类型,我假设这样做我可能需要更改其中一个或两个。
答案 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
,它是一个带有res
和a
类型的两个参数的闭包(函数+环境),并返回类型{{ 1}}。
在通话网站中,
res
第一个list0_foldleft<int><int>(xs, 1, lam(res, x) => res*x)
表示返回类型<int>
为res
,第二个int
表示列表元素的类型为<int>
(这可能不是你想要的)。
我相信你可以从这里找出问题所在。
答案 1 :(得分:1)
我想我已经找到了自己问题的答案:
第一个引用foldleft要返回的数据类型,第二个引用foldleft正在处理的列表中的数据类型。对于foldright,第一个和第二个交换位置。