0

我刚刚开始学习 SML 并且遇到了我的代码问题。我想将一个 int 与 List of int 进行比较并返回一个小于我的 int 的数字列表

 fun less(e, L): L =
  if L = [] then []
  else (hd[L] < e :: less tl(hd))

我想通过将其与列表 L 进行比较来返回所有小于 e 的数字的列表。我做错了什么?

4

2 回答 2

4
hd[L] < e :: less tl(hd)

首先less tl(hd)与just less tl hdor相同(less tl) hd。写作f g(x)并不意味着“将 g 应用于 x 并将 f 应用于结果”。为此,您需要编写f (g x). 一般来说,在原子表达式周围加上括号不会改变任何东西,并且通过在左括号之前省略空格,你会使语法看起来像它不是的东西,所以你应该避免这种情况。

然后tl hd根本没有多大意义,因为hd它是一个函数并且tl需要一个列表。您可能打算申请tlL而不是申请hd

然后hd [L]取列表的第一个元素[L][L]是一个包含单个元素的列表:L. 所以写作和写作hd [L]是一回事L。你可能是想带头L。为此,您只需编写hd L不带括号的内容。

现在的问题是您试图将 的结果(hd L) < e(一个布尔值)添加到列表中。这将起作用(就像在编译和运行时没有错误一样),但它会产生一个布尔值列表(其中将包含 atrue用于任何小于 e 的元素和 afalse用于任何其他元素)。这不是你说的你想要的。为了得到你想要的,你应该有一个if如果它小于则将头部附加到列表中,e并且当它不是时不添加任何东西。

修复这些问题应该使您的代码按预期工作。

PS:通常首选使用模式匹配来找出列表是否为空,并将非空列表拆分为头部和尾部。在大多数情况下最好避免使用和函数hd,因此也是如此。但是,如果您还没有涉及模式匹配,那么现在就可以了。tl= []

filterPPS:通过使用该函数,您可以更轻松且无需递归地做您想做的事。但是再说一遍:如果您还没有涉及到,那么您的方式现在就可以了。

于 2012-10-19T18:29:50.587 回答
1

我错了,是你没有比较元素。你只满足空列表。就像是

如果 e < hd L 则 e::less(e, (tl L))

于 2013-01-20T21:39:39.523 回答