我刚开始学习SML并且遇到代码问题。我想比较一个int与int的列表,并返回一个小于我的int
的数字列表 fun less(e, L): L =
if L = [] then []
else (hd[L] < e :: less tl(hd))
我想通过将它与列表L进行比较来返回所有小于e的数字的列表。我做错了什么?
答案 0 :(得分:4)
hd[L] < e :: less tl(hd)
首先less tl(hd)
与less tl hd
或(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
的结果(它是一个布尔值)添加到列表中。这将起作用(如在编译和运行中没有错误),但它将产生一个布尔列表(对于任何小于e的元素将包含true
,对于任何其他元素将包含false
。这不是你说的你想要的。为了获得你想要的东西,你应该有一个if
,如果它小于e
,它会将头部附加到列表中,如果不是hd
则不会前置任何内容。
修复这些问题应该可以使代码按预期工作。
PS:通常最好使用模式匹配来确定列表是否为空并将非空列表拆分为其头尾。在大多数情况下,最好避免使用tl
和= []
函数,filter
也是如此。但是,如果你尚未涉及模式匹配,那么现在就可以了。
PPS:使用{{1}}功能,您可以更轻松地执行您想要的操作而无需递归。但是再说一遍:如果你还没有覆盖,那你的方式现在还可以。
答案 1 :(得分:1)
我错了你没有比较这些元素。你只迎合空名单。
之类的东西如果e&lt; hd L然后e :: less(e,(tl L))