Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 在SML中使用折叠_Functional Programming_Sml_Smlnj - Fatal编程技术网

Functional programming 在SML中使用折叠

Functional programming 在SML中使用折叠,functional-programming,sml,smlnj,Functional Programming,Sml,Smlnj,我目前正在学习smlnj,但在使用折叠函数时遇到了问题 我要做的是编写一个函数select,它使用折叠模式并接受一个函数和一个列表。它将把列表的头部带入函数,以确定是否将该元素添加到列表中。这是我的意思的一个例子 select (fn x => x mod 2 = 0) [1,2,3,4,5,6,7,8,9,10]; val it = [2,4,6,8,10] : int list 所以,这是我到目前为止得到的 fun sele

我目前正在学习smlnj,但在使用折叠函数时遇到了问题

我要做的是编写一个函数select,它使用折叠模式并接受一个函数和一个列表。它将把列表的头部带入函数,以确定是否将该元素添加到列表中。这是我的意思的一个例子

          select (fn x => x mod 2 = 0) [1,2,3,4,5,6,7,8,9,10];
          val it = [2,4,6,8,10] : int list
所以,这是我到目前为止得到的

          fun select f l = foldl (fn (x,y) => if (f(x)) then x else 0) 0 l;
这显然不能正常工作。它只返回10。我确信我需要使用op::以某种方式使其工作,但我无法理解。我的想法是它应该看起来像这样

          fun select f l = foldl (fn (x,y) => if (f(x)) then op:: else []) [] l;

但这是行不通的。任何帮助都将不胜感激。谢谢

您正在实施的内容已经存在。它被称为
过滤器

- List.filter (fn x => x mod 2 = 0) [1,2,3,4,5,6,7,8,9,10];
val it = [2,4,6,8,10] : int list
您在第二个代码示例中的尝试非常接近。我可能会指出几个问题:

  • op::
    是一个运算符,它是一个函数。您可能不想返回函数。相反,您可能希望使用操作符从head元素和列表的其余部分创建一个列表,如下所示:
    x::y

  • 在else情况下,您当前返回一个空列表,并丢弃
    y
    中积累的所有内容。你可能不想那样做

  • 考虑一下左折还是右折最适合您的输出


    • 你很接近了。唯一的问题是传递给
      fold
      的函数中的
      if
      /
      else
      情况

      请记住,在您的
      fn(x,y)
      中,
      x
      是您正在考虑的列表元素,
      y
      是折叠列表其余部分的结果。如果
      f(x)
      失败,那么您希望从结果中排除
      x
      ,因此只需传递
      y
      。如果
      f(x)
      成功,您希望在结果中包含
      x
      ,因此返回
      y@[x]


      请注意,最好避免在可能的情况下使用append运算符(
      y@[x]
      ),因为它是线性时间运算,而prepending(
      x::y
      )是常量。当然,在这种情况下,用一个替换另一个将向后构建列表。您也可以通过向后折叠来解决此问题,即使用
      foldr
      而不是
      foldl

      谢谢。我真的很感激你的建议。