SML - 使用map解压缩

时间:2018-02-21 22:02:55

标签: sml smlnj

给出一个元组列表,

[(1,2),(3,4),(5,6)]

我需要解压缩它看起来像这样

 [[1,3,5],[2,4,6]]

解压缩需要是('a * 'a) list -> 'a list list类型。

到目前为止,我将此作为我的解压缩功能,但我的输入不正确,而且我不确定如何访问传递(' a *' a)。

val rec last =
        fn (h::nil) => h
           |(h::list) => last (list)
           | (nil) => raise Empty;

fun unzip [] = []
    | unzip L = [(map hd L), (map last L)]; 

这将返回'a list list -> 'a list list

2 个答案:

答案 0 :(得分:3)

您获得了元组列表

[(1,2),(3,4),(5,6)]

我们想要创建一个函数来将它们重新组织成

[[1,3,5],[2,4,6]]

我们知道输出应该类似于:

[ [tuple heads], [tuple tails] ]

我们知道 map 为我们提供了list的输出,这是我们正在寻找的数据类型。

因此,

fun unzip L = [ (map f1 L), (map f2 L) ]

我认为这是一个家庭作业问题,所以我会留在那里让你考虑 map 的适当功能。考虑一下元组的行为以及如何操作元组内的数据。请记住,f1应该与f2不同,因为两者操纵不同的事物。

Go Cougs!

答案 1 :(得分:1)

您也可以unzip使用foldr通过以下方式:

val unzip = foldr (fn ((x,y), (xs, ys)) = (x::xs, y::ys)) ([], [])