【问题标题】:Handle recursive function within an other function ocaml在另一个函数 ocaml 中处理递归函数
【发布时间】:2020-06-23 09:06:36
【问题描述】:

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

如果我有:

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

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

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 作为输入,并应返回相同的输入列表,但更改链接到所选 key 的值(如果在列表中)。 相反,support 做的是肮脏的工作。它构建一个新列表,当找到 k 时 i = k 它更改 value 并附加磁贴,关闭函数。

change 的返回是 unit,而应该是 (int * string) list。我认为是因为inserted 不被视为函数的返回。

【问题讨论】:

    标签: functional-programming ocaml


    【解决方案1】:

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

    我不知道您实际上打算如何处理返回值,因为现在您似乎并不关心它,但您可以通过将其分配给名称来修复错误:

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

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

    【讨论】:

    • 谢谢,不知道let()的意思是“我要写的返回是单位”现在都清楚了。
    猜你喜欢
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 2013-05-20
    • 2013-02-23
    • 2011-10-16
    • 2017-11-26
    相关资源
    最近更新 更多