0

我试图弄清楚如何返回另一个列表中特定值出现的索引列表。即索引(1,[1,2,1,1,2,2,1]);val it = [1,3,4,7] 整数列表

我试图弄清楚列表是如何工作的,并试图在递归方面做得更好,所以我不想使用 List.nth (或任何库函数),我还不想进入模式匹配安静状态。

这是我到目前为止所拥有的

fun index(x, L) =
if null L then 0
else if x=hd(L) then 
    1
else 
    1 + index(x,tl L);

fun inde(x, L) =
if null L then []
else if x=hd(L) then 
    index(x, tl L) :: inde(x, tl L)
else
    inde(x, tl L);

index(4, [4,2,1,3,1,1]);

inde(1,[1,2,1,1,2,2,1]);

这给了我类似 [2, 1, 3, 0] 的东西。我想我只是很难正确地增加东西来获得索引。index 函数本身可以正常工作。

4

2 回答 2

1

相反,您也可以对列表进行两次遍历:首先为列表中的每个元素添加一个索引,然后获取正确元素的索引:

fun addIndex (xs, i) =
    if null xs then []
    else (hd xs, i) :: addIndex(tl xs, i+1)

fun fst (x,y) = x
fun snd (x,y) = y
fun indexi(n, xs) =
    if fst(hd xs) = n then ... :: indexi(n, tl xs)
    else indexi(n, tl xs)

indexi(我为练习省略了部分内容。)在哪里addIndex([10,20,30],0)给你[(10,0),(20,1),(30,2)]。现在您可以使用addIndexindexi实现您的原始index功能:

fun index(n, xs) = indexi(n, addIndex(xs, 0))

当你得到它的工作时,你可以尝试合并addIndexindexi成为一个功能,两者兼而有之。

但是,您真的想用模式匹配来编写它,例如addIndex使用模式编写:

fun addIndex ([], _) = []
  | addIndex (x::xs, i) = (x,i) :: addIndex(xs, i+1)
于 2013-10-07T08:58:09.427 回答
0

如果你做 index(1,[2]),它会给出 1,这是不正确的。当列表为空时,它给你零。在这样的功能中,您可能想要使用 SOME/NONE 功能。

于 2013-10-06T23:17:53.563 回答