首页 > 解决方案 > 递归地将项目添加到 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) 之间放置一个运算符。我希望递归将元组项放入我创建的同一个列表中,我不知道操作员会做这样的事情。

谢谢你。

标签: recursionsmlsmlnj

解决方案


我会用明确的累加器参数来做到这一点:

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)

推荐阅读