SML-使用map解压
给定一个元组列表SML-使用map解压,sml,smlnj,Sml,Smlnj,给定一个元组列表 [(1,2),(3,4),(5,6)] 我需要把它解压成这样 [[1,3,5],[2,4,6]] 解压的类型必须是('a*'a)list->'a list list 到目前为止,我把它作为解压函数,但我的输入不正确,我不确定如何访问pass-through('a*'a) 这将返回一个列表->一个列表-给您一个元组列表 [(1,2),(3,4),(5,6)] 我们想创建一个函数来重新组织它们 [[1,3,5],[2,4,6]] 我们知道输出应该类似于: [ [tuple
[(1,2),(3,4),(5,6)]
我需要把它解压成这样
[[1,3,5],[2,4,6]]
解压的类型必须是('a*'a)list->'a list list
到目前为止,我把它作为解压函数,但我的输入不正确,我不确定如何访问pass-through('a*'a)
这将返回一个列表->一个列表-给您一个元组列表
[(1,2),(3,4),(5,6)]
我们想创建一个函数来重新组织它们
[[1,3,5],[2,4,6]]
我们知道输出应该类似于:
[ [tuple heads], [tuple tails] ]
我们知道,map为我们提供了一个列表的输出,这就是我们正在寻找的数据类型
因此,
fun unzip L = [ (map f1 L), (map f2 L) ]
我认为这是一个家庭作业问题,所以我将把它留在这里,让您思考map的适当功能。考虑元组的行为以及如何操作元组中的数据。请记住,f1
应该与f2
不同,因为两者操作不同的东西
去死吧 您还可以使用foldr
按以下方式解压缩
:
val unzip = foldr (fn ((x,y), (xs, ys)) = (x::xs, y::ys)) ([], [])
因为你的L
应该是一个元组列表,map hd L
没有意义,因为元组没有头。您的解压
是非递归的,这也是一个问题。我看不出map
与unzip
有多大关系。一个基于模式匹配的简单递归定义应该可以工作。加油!!谢谢你的洞察力!但是像[(map f L)、(map f L)]
这样的列表将是一个两元素的列表,其第一和第二个组件是相同的,因此不能看起来像[[1,3,5],[2,4,6]
。您需要在L
上映射两个不同的函数(如果您想使用map)。是的,第一个元素的函数应该不同于第二个元素。我对代码进行了编辑,使之与想法相似。
val unzip = foldr (fn ((x,y), (xs, ys)) = (x::xs, y::ys)) ([], [])