我是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);
答案 0 :(得分: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
个人变化是:
index
返回int option
类型的值。 NONE
表示该项不在列表中,SOME i
表示它在列表中,并且其第一次出现的索引为i
。这样,不需要使用特殊值(~1
),并且可以从其类型推断出函数的预期用法。m
并将其包装到使用适当参数调用它的外部函数index'
中来隐藏参数index
。 prime 字符(`)通常表示辅助值。List.nth
。另请注意,最常见的是,函数和变量名称以小写字母开头(索引而不是索引),而大写字母则用于构造函数常量(某些)之类的。
答案 1 :(得分:0)
我想提出一个更简单,效率更低的index
函数版本。我同意使用异常而不是int option
是不合适的,并且它不是尾递归的。但它肯定更容易阅读,因此可以作为学习材料:
fun index (x, []) = raise Subscript
| index (x, y::ys) =
if x = y then 0 else 1 + index (x, ys)
答案 2 :(得分:-1)
fun index(list,n)=
= if n=0 then hd(list) else index(tl(list),n-1);
val index = fn : 'a list * int -> 'a
index([1,2,3,4,5],2);
val it = 3 : int
index([1,2,3,4,5],0);
val it = 1 : int