gpt4 book ai didi

ocaml 递归模式匹配

转载 作者:行者123 更新时间:2023-12-04 11:31:19 28 4
gpt4 key购买 nike

我正在尝试编写一个简单的递归函数,它查看列表并返回一对整数。这很容易用 c/c++/java 编写,但我是 ocaml 的新手,因此由于类型冲突而很难找到解决方案

它应该像..

let rec test p l = ... ;;
val separate : (’a -> bool) -> ’a list -> int * int = <fun>
test (fun x -> x mod 2 = 0) [-3; 5; 2; -6];;
- : int * int = (2, 2)

所以问题是我怎样才能递归地返回元组上的值..

最佳答案

这里的一个问题是您要返回两种不同的类型:空列表的 int 或其他类型的元组。它必须是其中之一。

另一个问题是您试图将 1 添加到 test ,但是 test是一个函数,而不是一个值。您需要对其他东西调用 test 才能返回一个值,但即使如此,它也应该返回一个元组,您不能将其添加到整数中。

我无法弄清楚您希望代码做什么,但是如果您使用该信息更新您的问题,我可以提供更多帮助。

我的一个猜测是你想计算列表中的正数,在这种情况下你可以这样写:

let rec test l = 
match l with [] -> 0
| x::xs -> if x > 0 then 1 + (test xs)
else test xs;;

更新 :既然你已经编辑澄清问题,修改上面的代码如下:
let test l =
let rec test_helper l pos nonpos =
match l with [] -> (pos, nonpos)
| x::xs -> if x > 0 then test_helper xs 1+pos, nonpos
else test_helper xs pos 1+nonpos
in test_helper l 0 0;;

在这种情况下,使用累加器有很大帮助。它还使函数尾递归,这总是很好的做法。

关于ocaml 递归模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3042583/

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