recursion - 递归地将项目添加到 SML 中的 2 元组列表中
问题描述
我想递归地获取一个 2 元组列表(例如 [(1, 2), (3, 4), (5, 6)])并将其转换为两个 int 列表的元组(结果:([1, 3, 5], [2, 4, 6]))。我了解如何做相反的事情(取两个列表的元组并将其转换为元组列表),但我不明白如何在同一个列表上进行递归调用。
到目前为止,这是我的代码,我想我很接近:
fun toTuple [] = ([], [])
| toTuple [((x:int, y:int)::xs)] = (x::[], y::[]) toTuple (xs).
编译器给了我错误:
Error: operator is not a function [tycon mismatch]
operator: int list * int list
in expression:
(x :: nil,y :: nil) unzip
我相信这意味着我需要在 (x::[], y::[]) 和 toTuple (xs) 之间放置一个运算符。我希望递归将元组项放入我创建的同一个列表中,我不知道操作员会做这样的事情。
谢谢你。
解决方案
我会用明确的累加器参数来做到这一点:
fun loop (xs, ys, nil) = (rev xs, rev ys)
| loop (xs, ys, (x, y) :: zs) = loop (x :: xs, y :: ys, zs)
fun toTuple xs = loop (nil, nil, xs)
事后看来,以下内容会更有效:
fun loop (xs, ys, nil) = (xs, ys)
| loop (xs, ys, (x, y) :: zs) = loop (x :: xs, y :: ys, zs)
fun toTuple xs = loop (nil, nil, rev xs)
推荐阅读
- java - Java LocalDateTime 模式
- python - 无法理解的解析器行为
- google-api - 如何在没有 oauth 的情况下使用谷歌日历 API 访问用户谷歌日历信息?
- python - 最新 Python 版本 3.8.2 的导入错误没有名为 tkinter 的模块问题
- macos - 如何在 Mac/UNIX 的 osascript 对话框中添加密码输入表单
- android - RecyclerView 项目宽度在迁移到视图绑定后变为 wrap_content
- c++ - 通过匹配键的子元素来查找地图中的任何元素
- c++ - 类语法问题
- javascript - 为什么在 javascript 的 for-in 循环中执行 return 语句后的代码?
- google-apps-script - 从另一个帐户复制时需要打开电子表格