我正在寻找问题的帮助。 我正在尝试编写一个传递ML中的列表和函数的函数。 基本上,程序应该做的是列出并运行该函数中的每个元素。 如果函数返回true,则将元素添加到列表中,并在函数完成执行后返回列表。 这是我的代码:

fun select(x:list, funct)=      (* Define a new function that accepts a list and the prime function as a parameter*)
    while (tl(x) not nil) do(       (*While the tail is not empty*)
            if funct(hd(x)) then    (*Then run the function with the the head*)
                    val l = l::hd(x)        (*Adds the head of x to the list *)
            (*else 1+tl(x)*));

任何帮助将不胜感激。

===============>>#1 票数:4

一些提示:

  • 您几乎永远不会在ML中使用循环。 任何时候需要迭代时,请编写一个递归函数。
  • 您很少需要指定类型。 在这种情况下,ML可以从您正在调用tl(x)的事实推断出x必须是一个列表。
  • 通常不使用hd(x)tl(x)分解列表,而通常使用函数参数中的模式匹配来执行此操作。 代替单个参数x ,将参数写为x::xs x将被分配到列表的开头, xs被分配到列表的xs
  • 您可以使用不同的模式编写多个函数定义,而不必使用条件语句来检查参数的结构(在这种情况下,列表是否为空)。 ML会一一尝试,直到找到合适的为止。
  • 函数的主体必须是一个表达式 ,该表达式的计算结果为您的返回值。 ML中的所有内容都是表达; 即使if x then a else b本质上是一个返回ab的函数。

请牢记所有这些,以下是一些入门知识:

fun select([], funct) = []
|   select(x::xs, funct) = ...

这里的两种情况代替了while条件-只有当列表为nil时,才会评估第一种情况。 第二种情况下的模式会自动为列表的开头和结尾分配值。 该定义旨在递归; select([],funct)=[]是您的基本情况,而select(x::xs,funct)=...应该包括对select(xs,funct)的调用。

===============>>#2 票数:1

列出并通过函数运行每个元素。 如果函数返回true,则将元素添加到列表中,并在函数完成执行后返回列表。

这正是内置的List.filter函数。 无需重新发明轮子。

  ask by mikeyGlitz translate from so

未解决问题?本站智能推荐:

1回复

List.filter函数在SML / NJ中不起作用

我正在建立一个简单的功能,以从List1删除item ... 输入: 错误: 备用输入: 备用错误: 有什么想法为什么这么简单的功能不起作用?
3回复

SML / NJ - 使用foldr的一个行长度函数

我正在尝试创建一个长度函数,类似于已包含在ML中的长度函数。 我的限制是它必须在一行上完成并使用map,foldl或foldr。 现在我的代码行如下所示: 我绝不是ML的专家,但到目前为止,我的理由是这样的: 根据我的理解,foldr将从列表中的最后一项开始,将其作为我函数
1回复

SML / NJ编写一个以匿名函数为参数的过滤器函数

我被要求在SMLNJ中编写过滤器功能 它以函数f和列表L作为参数,并返回包含L的元素l的新列表,使得f(l)为true。 例如: 由于缺少ML的文档,我在此功能上停留了几个小时, 我想知道如何将第二个参数传递给第一个参数。
2回复

SML中高阶函数的签名

我一直在尝试了解SML中的高阶函数。 我知道如何编写简单的高阶函数,也了解签名。 一个例子是: 但是,我无法理解以下高阶函数的签名: 该函数可以写为: 我了解。 但是在上一个功能中,我无法理解操作顺序的工作方式。 函数是一次获取两个参数,还是一次生成一个新函数,然
3回复

如何在SML / NJ中使用队列库

我看到SML / NJ包含一个队列结构。 我无法弄清楚如何使用它。 如何使用SML / NJ提供的附加库?
1回复

仅使用SML / NJ打印打印输出

我正在尝试使用SML / NJ,我使用sml < source.sml来运行代码,但它打印出太多信息。 例如,这是source.sml : 这是输出: 来自标准ML中的抑制“val it”输出 , 如何禁用SMLNJ警告? ,并且SMLNJ想要从每个print语句执
1回复

SML中的双射函数

我想定义一个函数,该函数需要一个整数n并返回一个整数n *,使得n和n *在从1到n的同一整数集中,并且该函数必须是双射的。 我尝试了以下 但不幸的是,它对我所有的n值都返回1。 我真的被困在这里。 谁能给我一些实施方法的想法? bij的行为必须类似于
2回复

SML中的高阶功能作业

我在编写将包含函数列表和参数的函数时遇到麻烦,然后使用传递的参数调用每个函数,并返回调用结果的列表。 示例: build [f, g, h] 2将返回此值,但是调用了函数,而不是调用了结果: [f(2), g(2), h(2)]使用SML / NJ方式。 首先,我尝试了这种模式的许多变体
1回复

SML / NJ要求修改我的代码以使用fldr,fldl和map

我被要求修改我编写的代码,以便在大多数功能中我必须使用fldr or fldl 这是包含测试用例的描述。 我想知道如果您能给我一些提示,我应该在哪里修改以使用这些功能,那将是很棒的。 由于缺少ML的文档和示例,我不得不在这里提出这个问题 谢谢。
2回复

SML中的折叠操作

我执行以下foldl操作 因此,我希望这会产生4的结果,但会产生3的输出。 我想念什么? 我的踪迹是这样的: 并且由于acc> y,即2> 3,因此应进入else分支并返回4(3 + 1)。