SML:获取列表中项目的索引

One*_*eak 3 indexing list sml

我是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);
Run Code Online (Sandbox Code Playgroud)

wal*_*pus 5

为了详细说明我以前的评论,我建议对一个更适合ML习语的实现进行一些更改:

fun index(item, xs) =
  let
    fun index'(m, nil) = NONE
      | index'(m, x::xr) = if x = item then SOME m else index'(m + 1, xr)
  in
    index'(0, xs)
  end
Run Code Online (Sandbox Code Playgroud)

个人变化是:

  • index返回类型的值int option.NONE表示该项不在列表中,SOME i表示它在列表中,并且它的第一次出现的索引是i.这样,不需要使用特殊值(~1),并且可以从其类型推断出函数的预期用法.
  • m通过将函数重命名并将其index'包装到外部函数index中来隐藏参数,该函数使用适当的参数调用它.在主要字符(`)往往预示辅助值.
  • 使用列表上的模式匹配来获取单个元素,从而无需使用List.nth.

另请注意,最常见的是,函数和变量名称以小写字母(索引而不是索引)开头,而大写字母则用于构造函数常量(SOME)等.