在SML中编写过滤器函数定义

时间:2018-04-23 13:03:53

标签: filter sml

我试图在不使用abs的情况下在sml中编码过滤器定义。我几乎有代码工作。当x不是时,我无法弄清楚filter语句的返回值。 5。

这是我的代码:

if

1 个答案:

答案 0 :(得分:1)

正如John Coleman所说,过滤函数应该将其谓词('a -> bool函数)作为输入参数并调用它而不是内置谓词。否则,您的过滤器功能仅适用于非常具体的事情,您需要始终重新定义它。

只有在某些条件为真时,您才希望在结果中包含x。所以你不能写lessthan(x)::Filter(xs),因为这意味着它总是被包括在内。您目前正试图“不包含它”#34;让lessthan(x)返回0。但这意味着结果会被零填满,你无法区分真正的零。

例如:Filter [0,1,6]变为[0,1,0];现在你不再知道在过滤之前哪个零是零。理想情况下,过滤应该在此示例中为您提供[0,1]

提示:

  • if-then-else 移动到Filter的主要定义中,而不是谓词中。
  • 仅在true分支中使用::运算符。但是请在两个分支中调用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