【发布时间】:2013-07-24 05:40:23
【问题描述】:
我是 SML 的新手,我正在尝试获取列表中某个项目的索引。我知道使用 List.nth 会给我一个项目在索引位置的值,但我想要索引值。甚至可能有一个我不知道的内置函数。在我的情况下,列表将不包含重复项,因此如果该项目在列表中,我将获得索引,否则返回 ~1。这是我到目前为止的代码。它有效,但我认为它不是很干净:
val L=[1,2,3,4,5];
val m=length L-1;
fun Index(item, m, L)=if m<0 then ~1 else
if List.nth(L, m)=item then m else Index(item,m-1,L);
【问题讨论】:
-
您的问题到底是什么?我相信没有标准函数可以明确地做到这一点,至少在 List 结构中没有。至于清理代码,我建议 1) 使用 Option 或异常而不是返回
~1,2) 通过将函数包装在外部函数中来隐藏参数m,3) 在m上使用模式匹配消除一个条件 (if m < 0 ...) -
感谢您的提示。问题实际上是,“最好的方法是什么?”。最好不要将 m 传递给函数,因为它取决于 L 的长度,但就像我说的那样,我是 SML 的新手,不知道如何将两者结合起来。代码的原因是;我有两个相关的不同类型的列表。更新列表一中的项目需要更新列表二中相同位置的项目。我相信 List 结构可能会通过“zip”提供类似的东西,但现在可以使用。