我刚刚开始学习 SML 并且遇到了我的代码问题。我想将一个 int 与 List of int 进行比较并返回一个小于我的 int 的数字列表
fun less(e, L): L =
if L = [] then []
else (hd[L] < e :: less tl(hd))
我想通过将其与列表 L 进行比较来返回所有小于 e 的数字的列表。我做错了什么?
hd[L] < e :: less tl(hd)
首先less tl(hd)
与just less tl hd
or相同(less tl) hd
。写作f g(x)
并不意味着“将 g 应用于 x 并将 f 应用于结果”。为此,您需要编写f (g x)
. 一般来说,在原子表达式周围加上括号不会改变任何东西,并且通过在左括号之前省略空格,你会使语法看起来像它不是的东西,所以你应该避免这种情况。
然后tl hd
根本没有多大意义,因为hd
它是一个函数并且tl
需要一个列表。您可能打算申请tl
,L
而不是申请hd
。
然后hd [L]
取列表的第一个元素[L]
。[L]
是一个包含单个元素的列表:L
. 所以写作和写作hd [L]
是一回事L
。你可能是想带头L
。为此,您只需编写hd L
不带括号的内容。
现在的问题是您试图将 的结果(hd L) < e
(一个布尔值)添加到列表中。这将起作用(就像在编译和运行时没有错误一样),但它会产生一个布尔值列表(其中将包含 atrue
用于任何小于 e 的元素和 afalse
用于任何其他元素)。这不是你说的你想要的。为了得到你想要的,你应该有一个if
如果它小于则将头部附加到列表中,e
并且当它不是时不添加任何东西。
修复这些问题应该使您的代码按预期工作。
PS:通常首选使用模式匹配来找出列表是否为空,并将非空列表拆分为头部和尾部。在大多数情况下最好避免使用和函数hd
,因此也是如此。但是,如果您还没有涉及模式匹配,那么现在就可以了。tl
= []
filter
PPS:通过使用该函数,您可以更轻松且无需递归地做您想做的事。但是再说一遍:如果您还没有涉及到,那么您的方式现在就可以了。
我错了,是你没有比较元素。你只满足空列表。就像是
如果 e < hd L 则 e::less(e, (tl L))