【问题标题】:Coding the filter function definition in SML在 SML 中编码过滤器函数定义
【发布时间】:2018-04-23 23:01:16
【问题描述】:

我正在尝试在不使用filter 的情况下以 sml 对过滤器定义进行编码。我几乎让代码工作了。当 x 不是 if 语句的返回值。

这是我的代码:

fun Filter[] = [] | Filter(x::xs) =
let
 fun lessthan x = if x < 5 then x else 0 
in
  lessthan(x)::Filter(xs)
end;

【问题讨论】:

  • 欢迎来到 Stack Overflow!当问题陈述很简单时,很难提供解决方案"it doesn't work"。请edit您的问题更完整地描述您预期会发生什么以及这与实际结果有何不同。请参阅 How to Ask 以获取有关什么是好的解释的提示。
  • 如果您尝试“对过滤器定义进行编码”,那么为什么要在特定谓词 (x &lt; 5) 中进行硬接线? filter 函数的用途不止是返回列表中少于 5 个的元素。 List.filter 具有 fn : ('a -&gt; bool) -&gt; 'a list -&gt; 'a list 类型,但您似乎正在尝试创建 int list -&gt; int.list 类型的函数。

标签: filter sml


【解决方案1】:

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

本质上,只有在某些条件为真时,您才希望在结果中包含x。所以你不能写lessthan(x)::Filter(xs),因为那意味着它总是被包括在内。您目前正试图通过让lessthan(x) 返回0 来“不包含它”。但这意味着结果会变得杂乱无章,您无法将它们与 真正的 零区分开来。

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

提示:

  • if-then-else 移到 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
    

【讨论】:

  • 此模板是否使用模式匹配?
  • @kekundel:它在列表上使用模式匹配:第一个 [] 是匹配空列表的模式,在这种情况下,过滤通常是空列表(没有可以删除的项目),而x::xs 是一个匹配非空列表的模式,其中第一个元素是x,尾部是xs,在这种情况下可能需要进行一些过滤(应该包括x ?) 和一些递归调用(xs 也应该被过滤)。所以是的,有模式匹配。
猜你喜欢
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
相关资源
最近更新 更多