gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:50:38 24 4
gpt4 key购买 nike

我是 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);

最佳答案

为了详细说明我之前的评论,我建议对更适合 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),并且可以从其类型推断出函数的预期用途。
  • 通过将函数重命名为 index' 并将其包装到使用适当参数调用它的外部函数 index 来隐藏参数 m . prime 字符 (`) 通常表示辅助值。
  • 在列表中使用模式匹配来获取单个元素,从而无需 List.nth

另请注意,大多数情况下,函数和变量名称以小写字母开头(index 而不是 Index),而大写字母用于构造函数常量(一些) 等。

关于list - SML:获取列表中项目的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17826034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com