在其他函数 ocaml 中处理递归函数

Handle recursive function within an other function ocaml

如果我在 Ocaml 函数中有一个或多个递归函数,我如何在不退出主函数的情况下调用它们并将它们的值作为主函数的 return? 我是 Ocaml 的新手,所以我会尝试更好地解释我...

如果我有:

let function =
 let rec recursive1 = ...
 ...
 let rec recursive2 = ...
 ...

我如何在 function 中调用它们来告诉它“嘿,你看到这个递归函数了吗?现在调用它并获取它的值。” 因为我的问题是 Ocaml 作为我函数的 return 看到 Unit 而不是正确的 return。 我将 post 下面的代码 :

let change k v list_ = 
 let rec support k v list_ =
  match list_ with
  | [] -> []
  | (i,value) :: tl  -> if i = k 
                       then (k,v) :: tl 
                       else (i,value) :: support k v tl in 
  let inserted = support k v list_ in inserted

let () =
 let k = [ (1,"ciao");(2,"Hola");(3,"Salut") ] in 
 change 2 "Aufwidersen" k 

Change 将一个键、一个值和一个 (int * string )list 作为输入,并且应该 return 相同的输入列表但更改链接到 key 的值选中(如果在列表中)。 support,相反,做肮脏的工作。它构建一个新列表,当找到 k 时 i = k 它会更改 value 并附加磁贴,关闭该功能。

change 的 return 是 unit 而应该是 (int * string) list。我认为是因为 inserted 未被视为函数的 return。

change 不 return unit。该错误实际上告诉您恰恰相反,它 returns (int * string) list 但它期望 unit。它需要单位,因为您将其分配给 () 模式。

我不知道你实际上打算用 return 值做什么,因为现在你似乎并不关心它,但你可以通过将它分配给一个来修复错误姓名:

let result: (int * string) list =
 let k = [ (1,"ciao");(2,"Hola");(3,"Salut") ] in 
 change 2 "Aufwidersen" k 

因为它没有被使用,所以我添加了一个类型注释来确保我们在这里得到我们期望的,否则 result 可以是任何东西并且编译器不会抱怨。但是,如果您打算使用 result,则通常不需要它,因为如果类型与其用法不一致,您会收到错误消息。