gpt4 book ai didi

ocaml - 可选参数无法删除?

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

我想要一个尾递归版本的 List.map ,所以我自己写的。这是:

let rec list_map f l ?(accum=[])=
match l with
head :: tail -> list_map f tail ~accum:(head :: accum)
| [] -> accum;;

每当我编译这个函数时,我都会得到:
File "main.ml", line 69, characters 29-31:
Warning X: this optional argument cannot be erased.

tutorial说这意味着我正在尝试创建一个没有非可选参数的函数。但是上面的函数显然采用了非可选参数。

我可能只是在做一些非常愚蠢的事情,但是什么?

最佳答案

以前的解决方案确实可以编译,但不会给出预期的结果。函数f永远不会应用于参数。正确的代码是:

let rec list_map f ?(accum = []) l = match l with
| head :: tail -> list_map f ~accum:(f head :: accum) tail
| [] -> accum;;

推断的类型是:
val list_map : ('a -> 'b) -> ?accum:'b list -> 'a list -> 'b list = <fun>

...与错误的相反:
val list_map : 'a -> ?accum:'b list -> 'b list -> 'b list = <fun>

请注意,结果列表是相反的:
# list_map ( ( ** ) 2.) [1.;2.;3.;4.];;
- : float list = [16.; 8.; 4.; 2.]

... 等于函数 rev_list from the List module :
# List.rev_map ( ( ** ) 2.) [1.;2.;3.;4.];;
- : float list = [16.; 8.; 4.; 2.]

因此,您可能希望将函数更改为:
let rec list_map f ?(accum = []) l = match l with
| head :: tail -> list_map f ~accum:(f head :: accum) tail
| [] -> List.rev accum;;

...也应该是尾递归的(根据手册)并以原始顺序返回列表:
# list_map ( ( ** ) 2.) [1.;2.;3.;4.];;
- : float list = [2.; 4.; 8.; 16.]

关于ocaml - 可选参数无法删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1667232/

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