如何检查OCaml中的下一个'head'是空的?

fly*_*key 8 ocaml functional-programming list

我是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 
Run Code Online (Sandbox Code Playgroud)

提前致谢!

pad*_*pad 9

你快到了.这个想法在三种情况下分解列表,其中有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
Run Code Online (Sandbox Code Playgroud)

我对你的功能有几点评论:

  • 类型注释是多余的.因为(^)是串并置运算符,类型检查器可以推断类型的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
Run Code Online (Sandbox Code Playgroud)

甚至更简洁:

 let rec join sep = function
    | [] -> ""
    | x::[] -> x
    | x::xs -> x ^ sep ^ join sep xs 
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 7

空列表是[],包含一个元素[h]的列表和包含至少一个元素的列表h::t.所以你的功能可以写成:

let rec join separator = function
  | []   -> ""
  | [h]  -> h
  | h::t -> h ^ separator ^ join separator t
Run Code Online (Sandbox Code Playgroud)