gpt4 book ai didi

python - OCaml 中最简单的 Python 枚举函数模拟是什么?

转载 作者:行者123 更新时间:2023-12-05 09:01:46 25 4
gpt4 key购买 nike

在 Python 中枚举的工作方式如下:

a_list = ['a', 'b', 'c']

for i, x in enumerate(a_list):
print(i, x)

输出将是:

0 a
1 b
2 c

因此,enumerate 实际上返回一个生成器(几乎是一个惰性序列)形式为 (i, x) 的对,其中 i 的范围超过 0、1、2 ...,x 是列表中的元素,顺序为.

到目前为止,我已经为列表提出了这个定义,它不生成“生成器”,而是生成对列表:


let enumerate (a_list: 'a list): (int * 'a) list =
let rec _enumerar (a_list: 'a list) (accum: (int * 'a) list) (i: int): (int * 'a) list =
match a_list with
| [] -> accum
| x::xs -> _enumerar xs ((i, x)::accum) (i+1)
in
_enumerar a_list [] 0 |> List.rev

示例用法:

# enumerate ['a'; 'b'; 'c'];;
- : (int * char) list = [(0, 'a'); (1, 'b'); (2, 'c')]

对于这个可能具有不同名称的函数是否在标准库或 Base 中的任何地方实现有任何想法吗?

使用 Sequence 或 Stream 的惰性版本怎么样?

最佳答案

最简单的 OCaml 等价物是:

List.iteri (Printf.printf "%d %c\n") ['a'; 'b'; 'c']

Python 使用 for loopenumerate 因为它对高阶函数的支持有限。相比之下,OCaml 中的大多数可枚举容器类型倾向于直接提供迭代器、映射和折叠的 i 版本。

如果您想从 Python 进行更直接的翻译,生成器的 OCaml 版本是 Seq.t,因为它们都是外部迭代器:

   Seq.iter (fun (i,x) -> Printf.printf "%d %c\n" i x)
@@ Seq.mapi (fun i x -> i, x)
@@ List.to_seq ['a';'b';'c']

(暂时忘记 Seq.iteri OCaml 4.14 也存在)

关于python - OCaml 中最简单的 Python 枚举函数模拟是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72622163/

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