gpt4 book ai didi

list - 如何在OCaml中检查下一个 'head'为空?

转载 作者:行者123 更新时间:2023-12-01 22:54:39 25 4
gpt4 key购买 nike

我是 OCaml 的新手(通常仍然是学习编程的新手),我有一个关于检查字符串列表中的下一个元素是什么类型的字符串的快速问题。

我希望它在字符串的每个元素之间放置一个分隔符(最后一个除外),但我不知道如何让程序“知道”最后一个元素是最后一个元素。

这是我现在的代码:

let rec join (separator: string) (l : string list) : string = 
begin match l with
| []->""
| head::head2::list-> if head2=[] then head^(join separator list) else head^separator^(join separator list)
end


let test () : bool =
(join "," ["a";"b";"c"]) = "a,b,c"
;; run_test "test_join1" test

提前致谢!

最佳答案

您快到了。这个想法是在三种情况下分解列表,其中有 0、1 或至少 2 个元素。当列表有多个元素时,您可以安全地插入 separator进入输出字符串:

let rec join (separator: string) (l : string list) : string =   
begin match l with
| [] -> ""
| head::[] -> head
| head::list-> head^separator^(join separator list)
end

我对您的功能有几点意见:
  • 类型注释是多余的。因为 (^)是字符串连接运算符,类型检查器可以推断 separator 的类型, l和函数的输出很容易。
  • 无需使用begin/and一对。由于您只有一层模式匹配,因此编译器不会混淆。
  • 您可以使用 function消除 match l with部分。

  • 因此,您的代码可以缩短为:
    let rec join sep l = 
    match l with
    | [] -> ""
    | x::[] -> x
    | x::xs -> x ^ sep ^ join sep xs

    或者更简洁:
     let rec join sep = function
    | [] -> ""
    | x::[] -> x
    | x::xs -> x ^ sep ^ join sep xs

    关于list - 如何在OCaml中检查下一个 'head'为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8953495/

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