给出一个通用列表,返回一个在元组中包含相同对象的列表,并在列表中列出它们的索引。
例如:
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;
我应该在一个元组中将列表项添加到这些索引中,但是我不确定该怎么做。
答案 0 :(得分:1)
以下是解决问题的一种方法:
1)使用List.sub
创建一个匿名函数,该函数将索引i
发送到由i
和索引lst
上的i
元素组成的对。
2)将其映射到通过在List.tabulate
上调用length lst
和将x
发送到x
的函数获得的结果。
我能够做到这一点(单行),但是与简单的模式匹配方法相比,结果很难看。除了困惑之外,我看不出有什么理由拒绝让SML成为一种优雅的语言。
答案 1 :(得分:1)
看来我忘记了#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;