List SML向列表添加索引
给定一个泛型列表,返回一个包含元组中相同对象的列表,其索引在列表中 例如:List SML向列表添加索引,list,sml,List,Sml,给定一个泛型列表,返回一个包含元组中相同对象的列表,其索引在列表中 例如: f ["a", "b"]; - val it = [(0,"a") , (1,"b")] : (int * string) list 函数应该是一个单行程序,这意味着没有模式匹配、递归、if/else、helper函数和let/local。到目前为止,我只能根据输入列表列出索引: fun f lst = List.take((foldl (fn (x,list) => [(hd(list)-1)]@list) [
f ["a", "b"];
- val it = [(0,"a") , (1,"b")] : (int * string) list
函数应该是一个单行程序,这意味着没有模式匹配、递归、if/else、helper函数和let/local。到目前为止,我只能根据输入列表列出索引:
fun f lst = List.take((foldl (fn (x,list) => [(hd(list)-1)]@list) [length(lst)] (lst)),length(lst));
f [#"a",#"b"];
- val it = [0, 1]: int List.list;
我应该将列表项添加到元组中的这些索引中,但我不确定如何执行该操作。这里有一个解决方法的提示: 1) 使用
List.sub
,创建一个匿名函数,将索引i
发送到由i
和索引i
处的lst
元素组成的对
2) 将其映射到通过调用列表获得的结果上。在长度lst
上制表,并将x
发送到x
的函数
我能够(在一行上)实现这一点,但与简单的模式匹配方法相比,结果很糟糕。除了作为一个谜题,我看不出禁止SML成为优雅语言的动机。似乎我忘记了使用#I操作符访问元组的第I个元素。答案如下:
fun f xs = List.take((foldr (fn (x,list) => [(#1(hd(list))-1,x)]@list) [(length(xs),hd(xs))] (xs)),length(xs));
f (explode "Hello");
- val it = [(0, #"H"), (1, #"e"), (2, #"l"), (3, #"l"), (4, #"o")]: (int * char) List.list;