我试图在不使用abs
的情况下在sml中编码过滤器定义。我几乎有代码工作。当x不是时,我无法弄清楚filter
语句的返回值。 5。
这是我的代码:
if
答案 0 :(得分:1)
正如John Coleman所说,过滤函数应该将其谓词('a -> bool
函数)作为输入参数并调用它而不是内置谓词。否则,您的过滤器功能仅适用于非常具体的事情,您需要始终重新定义它。
只有在某些条件为真时,您才希望在结果中包含x
。所以你不能写lessthan(x)::Filter(xs)
,因为这意味着它总是被包括在内。您目前正试图“不包含它”#34;让lessthan(x)
返回0
。但这意味着结果会被零填满,你无法区分真正的零。
例如:Filter [0,1,6]
变为[0,1,0]
;现在你不再知道在过滤之前哪个零是零。理想情况下,过滤应该在此示例中为您提供[0,1]
。
提示:
Filter
的主要定义中,而不是谓词中。::
运算符。但是请在两个分支中调用Filter
。这是一个模板:
fun filter p [] = []
| filter p (x::xs) =
if (* some condition that shouldn't just be 'lessthan' *)
then (* something with '::' and also with 'x' and 'filter p xs' *)
else (* something without '::' but still with 'filter p xs' *)
然后您可以调用该代码:
- fun lessthan5 x = x < 5;
- filter lessthan5 [0,3,5,9];
> val it = [0,3] : int list
或使用匿名函数:
- filter (fn x => x < 5) [0,3,5,9];
> val it = [0,3] : int list