标准 ML 展开列表

2024-05-13

路线

功能expand接收任意类型的列表和整数 数字n,并返回一个列表,其中输入列表的每个项目是 复制的n次。例如,展开 [1,2,3] 3 必须是 计算结果为 [1,1,1,2,2,2,3,3,3]。函数的类型必须是“a” 列表→int→‘列表。

这是我的解决方案,我通过使用两个函数稍微绕过了要求。我正在努力解决的是重置n当我转到列表中的下一项时,恢复为原始值。我在实现中通过保存原始文件来做到这一点n价值s这是永远不会改变的。我该如何消除对s?

fun duplicate([], n, s) = [] |
    duplicate(l, n, s) = 
    if n > 1 then hd l::duplicate(l, (n-1), s)
    else hd l::duplicate(tl l, s, s);

fun expand([], n) = [] |
    expand(l, n) = duplicate(l, n, n);

定义辅助函数并不是“作弊”,而是很好。
一个更大的问题是你定义了一个错误类型的函数 - 的类型expand对于练习来说,比最终得到的函数数量更重要(请注意,描述说明了类型“必须是什么”,但并不是不允许您定义辅助函数)。

您遇到问题是因为您试图立即“攻击”整个输入列表。
当你遇到“对列表中的每个元素执行 X 操作”的问题时,首先要做的就是思考“编写一个函数,用以下命令执行 X 操作”:one事情然后List.map it".

如果我们有一个可以重复某些事情的函数k有时,我们可以将其应用于每个列表元素。

我们可以写repeat: int * 'a -> 'a list,但这既需要一个数字又需要一个东西,并且不方便map任何地方。
如果我们可以动态“修复”数字并获得一个函数,那就太好了'a -> 'a list.
如果您以方便的顺序给出参数,柯里化就可以让您做到这一点。

fun repeat 0 i = []
  | repeat n i = i :: repeat (n - 1) i;

负载和测试:

val repeat = fn : int -> 'a -> 'a list
val it = () : unit
- repeat 3 4;
val it = [4,4,4] : int list

到目前为止看起来不错。
我们现在可以写repeat 4并得到一个接受“某物”并重复四次的函数。

让我们使用它:

- fun expand xs n = List.map (repeat n) xs;
val expand = fn : 'a list -> int -> 'a list list

类型看起来不太好。让我们看看我们刚刚创建了什么。

- expand [1,2,3] 3;
val it = [[1,1,1],[2,2,2],[3,3,3]] : int list list

几乎是正确的 - 列表应该是“平坦的”。

幸运的是,列表结构 http://sml-family.org/Basis/list.html#SIG:LIST.list:TY:SPEC有一个功能可以帮助:concat: 'a list list -> 'a list,它接受一个列表列表并将它们附加在一起,所以我们可以将结果传递给它:

- fun expand xs n = List.concat (List.map (repeat n) xs);
val expand = fn : 'a list -> int -> 'a list

看起来好多了。

- expand [1,2,3] 3;
val it = [1,1,1,2,2,2,3,3,3] : int list
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

标准 ML 展开列表 的相关文章

  • SML 警告:使用空列表或 NONE 选项时,类型变量未通用化

    我一生都无法弄清楚为什么以下 SML 函数在我的作业问题中抛出警告 fun my func f ls case ls of gt raise MyException head rest gt case f head of SOME v gt
  • 1个案例多种模式

    在 SML 中 一个 case 语句中是否可以有多种模式 例如 我有 4 个算术运算符以字符串形式表示 我想打印 PLUS MINUS 其中是 or and MULT DIV 如果是 or TL DR 有什么地方可以简化以下内容以使用更少的
  • NJ 的 ML 中的嵌套本地声明

    大家好 我有这段代码 local helper f i j local fun NTimesF f n int if n 1 then fn x gt f x else fn x gt f NTimesF f n 1 x in if i l
  • 如何在 Mac 上安装 Standard ML 的工作版本?

    我使用的是 Mac OSX 10 7 5 但我似乎无法下载可用的 REPL 的标准 ML 编译器 这应该有这么难吗 我应该下载一个最好的 ML 吗 我尝试过 SML NJ 和 MLton 但没有成功 Mac 用户也可以使用 brew ins
  • 这个函数签名在sml中是什么意思?

    我正在查看我的教授关于 SML 语言的一些注释 其中一个函数如下所示 fun max gt let fun lp curr curr lp curr a l if gt a curr then lp a l else lp curr l i
  • 查看 SML 完整列表

    有没有办法使用 SML 打印完整列表 通常在 SML 中发生的情况是 当我有太多元素时 它会打印前几个元素 并用 分隔 然后省略列表的其余部分 但我想查看完整的列表 有什么办法可以做到这一点吗 val a 1 2 3 4 5 6 7 8 9
  • SML 中绑定的价值?

    有人可以解释一下为什么评估后 and 的值一定是 16 这是正确的答案吗 我认为答案 3 是因为我们调用函数 f 并将值 1 和 2 作为函数 f 发送 但看不到值 5 和 10 但我想我错了 val x 1 val y 2 val f f
  • 我可以注释“fun”声明的完整类型吗?

    在学习环境中 我可以选择哪些选项来为函数提供类型签名 标准 ML 没有像 Haskell 那样的顶级类型签名 以下是我考虑过的替代方案 模块签名 需要单独的签名文件 或者在与模块本身相同的文件内的单独块中定义的类型签名 这需要使用模块 在任
  • 通过索引变量访问 SML 元组

    问题很简单 如何在SML中使用索引变量访问元组 val index 5 val tuple1 1 2 3 4 5 6 7 8 9 10 val correctValue index tuple1 我希望有人能够提供帮助 提前致谢 不存在接受
  • 修复 OCaml 中的数据类型

    Haskell 中的以下数据类型如何用 OCaml 或 SML 表示 newtype Fix f In f Fix f 我已经在邮件列表上回答了这个问题 https sympa inria fr sympa arc caml list 20
  • ML 中 ref 函数的用法

    考虑到 ref 运算符 我很难理解它的应用以及以下指令的含义 1 在这个定义中我定义什么 val ref x ref 9 val x 9 int 2 我在这里用 ref x ref 12 做什么 val x ref 8 val x ref
  • SML/NJ:如何使用哈希表?

    我真的很想在 SML 中创建一个哈希表 似乎 SML NJ 中已经有一个结构 问题是 我该如何使用它 我还没有完全理解如何在SML中使用结构 并且我读过的书中的一些非常基本的示例给了我错误 我什至不知道如何纠正 所以使用HashTable结
  • 何时在 SML 中使用分号?

    我知道分号在 REPL 中用作终止符 但我对何时在源文件中使用它们感到困惑 例如 之后不需要val x 1 但如果我之后省略它use foo sml 编译器会抱怨它 那么 分号的使用规则是什么呢 分号用于 SML 中的许多语法实体 它们通常
  • Objective C 中的惰性数据类型

    在 SML 中 可以采用以下方式对惰性编程进行建模 Have a datatype to wrap a computation datatype a susp Susp of unit gt a A function to hold the
  • 如何在SML中使用IntInf或LargeInt?

    我想通过此链接中的 pow 等函数在 SML 中执行大整数计算 http www standardml org Basis int inf html IntInf STR SPEC http www standardml org Basis
  • 这种模式似乎很详尽,但我仍然收到警告

    我正在学习 sml 并编写了以下简单函数 Return a list with every other element of the input list fun everyOther everyOther x x everyOther x
  • SML 中的 'a 和 ''a 有什么区别?

    例如 fun example a a list list a 将有以下签名 a list gt a list 如果我定义不同但内容相同怎么办 例如 fun example a a list list a 它的签名是 a list gt a
  • number_in_month 练习(计算列表中的元素数)

    我一直在尝试使用 SML 对整数 3 元组列表中的元素进行计数 该列表等于给定的整数 但它不起作用 谁能帮我找出下面的代码有什么问题或者为我纠正它 fun number in month x int int int list m int i
  • 标准 ML 展开列表

    路线 功能expand接收任意类型的列表和整数 数字n 并返回一个列表 其中输入列表的每个项目是 复制的n次 例如 展开 1 2 3 3 必须是 计算结果为 1 1 1 2 2 2 3 3 3 函数的类型必须是 a 列表 int 列表 这是
  • ML 中高阶函数中的 curry 和 uncurry 是什么

    fun curry f x y f x y fun uncurry f x y f x y fun compose f g x f g x 我了解 compose 函数 但不太了解 ML 中的 curry 和 uncurry 谁能解释一下这

随机推荐

  • 将初始值传递给 django 中的模型表单

    如何将字段的初始值传递给模型表单 我有类似下面的代码 class ScreeningForm forms ModelForm class Meta model Screening def init self args kwargs supe
  • Python:Scrapy返回元素后面的所有html,而不仅仅是元素的html

    我遇到了 Scrapy 行为异常的问题 几个月前我编写了一个简单的函数 它返回给定 xpath 处的项目列表 def get html response path sel Selector text response page source
  • 如何调试仅在发布模式下崩溃的 Android 应用程序

    在调试模式下一切正常 但在发布模式下崩溃 调试模式下有哪些所需权限在发布模式下未打开 EDIT 当我将 链接 设置为 无 时 我会通过第一个屏幕进入 登录 屏幕 但是 当我添加发布权限时Internet 第一次尝试读取远程实体框架核心表时它
  • PHP + FTP删除文件夹中的文件

    我刚刚编写了一个 PHP 脚本 它应该连接到 FTP 并删除特殊文件夹中的所有文件 它看起来像这样 但我不知道需要什么命令来删除文件夹日志中的所有文件 任何想法
  • 如何融合颜色和形状?

    当我有一个超过 6 个值的变量时 我的麻烦就开始了 因为这是 ggplot2 中 scale shape 函数的当前最大值 由于这个问题 我尝试使用另一个变量来解决这个问题 我只是将原始变量的长度包裹起来 这是我的示例代码 dataf lt
  • 点集子集的最小周长凸包

    给定平面上的 n 个点 没有 3 个共线 给定数字 k 找到 k 个点的子集 使得 k 个点的凸包在 k 个点的子集的任何凸包中具有最小周长 我可以想到一个简单的方法 运行时间为 O n k k log k 找到大小为 k 的每个子集的凸包
  • 隐藏 JTable 临时列

    我正在使用 JTable 显示数据库中的数据 现在我想通过 Jcombobox 过滤我的 jtable 我正在使用 Jcombo 框 其中包含 030 024 045 等值 这些值已在 jtable 中设置为列标题 当我单击组合时 选定的列
  • 我可以在C中直接比较int和size_t吗?

    我可以比较一个int and a size t像这样的变量 int i 1 size t y 2 if i y Do something 或者我必须输入其中之一 只要满足以下条件 它就是安全的int为零或正数 如果它是负数 并且size t
  • 选择要重写哪个基类的方法

    鉴于以下情况 class Observer public virtual void Observe Parameter p 0 template
  • 具有上限的联合类型

    我正在遵循这个问题的公认答案中提出的技术如何定义 类型析取 联合类型 https stackoverflow com questions 3508077 does scala have type disjunction union type
  • PHP 启动:运行单元测试时无法加载动态库

    当我尝试运行单元测试时 出现此错误 PHP 警告 PHP 启动 无法加载动态库 bz2 尝试过 xampp php ext bz2 找不到指定的模块 xampp php ext php bz2 dll 找不到指定的模块 在未知的第 0 行
  • 黑色左/右三角形大小不同

    我使用黑色左指三角形 右左指三角形几何形状作为网站上的链接 并使用它们的 HTML 代码 和 9664 9654 由于某种原因 即使我在没有其他元素的空白页面上使用三角形 它们也不会以相同的大小显示 在 Chrome 上 向左指向的位置比向
  • 将参数从 Web 表单传递到 Crystal 报表

    我有一份报告 我想将其显示在网络表单上 没有参数的报告运行良好 带参数的报告让我很头疼 这是我在 BindReport 方法中编写的代码 该代码在表单的页面加载事件上调用 ReportDocument rpt new ReportDocum
  • 如何在 Ruby on Rails 中不使用 eval 将字符串转换为哈希值? [复制]

    这个问题在这里已经有答案了 这里是string需要转换成hash status gt label gt Status collection gt return misc definitions project status 我们不能使用ev
  • Excel 2007:删除单元格中的文本限制

    我想至少输入500 个字符在 Excel 工作表单元格中 但是当我这样做时 它只允许我添加 1 段 例如196 个字符 当我添加另一段时 它会给我一条消息 超出文字限制 我该如何解决这个问题 以便我可以在单元格中添加大量文本 我用谷歌搜索并
  • gcc 中的“假设”子句

    gcc 最新版本 4 8 4 9 是否有类似于以下的 假设 子句 assume 内置icc支持吗 例如 assume n 8 0 从 gcc 4 8 2 开始 gcc 中没有 assume 的等效项 我不知道为什么 这会非常有用 马夫索建议
  • 启动使用 Simperium 的应用程序时 objectFromJSONString 崩溃

    我得到了一个JSON当我尝试启动使用 Simperium 框架的应用程序时崩溃 NSCFString objectFromJSONString unrecognized selector sent to instance 0x6c561a0
  • 基于 ID 的 UiLocalNotifications

    是否有关于根据那里的 Id 存储 UIlocalNotifications 并根据那里的 Id 取消通知的教程 在本地通知中 您有此词典的用户词典 您可以取消通知 http www picksourcecode com ps ct 1612
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 标准 ML 展开列表

    路线 功能expand接收任意类型的列表和整数 数字n 并返回一个列表 其中输入列表的每个项目是 复制的n次 例如 展开 1 2 3 3 必须是 计算结果为 1 1 1 2 2 2 3 3 3 函数的类型必须是 a 列表 int 列表 这是