使用concat的ocaml stringOfList

时间:2012-10-27 02:11:28

标签: ocaml

我目前拥有的代码就是我正在测试stringOfList函数

let rec sepConcat sep sl = match sl with
   | [] -> ""
   | h :: t -> 
       let f a x = a^sep^x in
       let base = h  in 
       let l = t in  
         List.fold_left f base l

let stringOfList f l = sepConcat  "; " (List.map f l)

我应该得到的输出是

# stringOfList string_of_int [1;2;3;4;5;6];;
- : string = "[1; 2; 3; 4; 5; 6]"

但我正在

# stringOfList string_of_int [1;2;3;4;5;6];;
- : string = "1; 2; 3; 4; 5; 6"

我做错了什么?如何在括号内添加额外的[]。 Sepconcat应该这样做

# sepConcat ", " ["foo";"bar";"baz"];;
- : string = "foo, bar, baz"

# sepConcat "---" [];;
- : string = ""

# sepConcat "" ["a";"b";"c";"d";"e"];;
- : string = "abcde"

# sepConcat "X" ["hello"];;
- : string = "hello"

2 个答案:

答案 0 :(得分:2)

你没有做错任何事,代码中没有添加方括号字符的地方。

我会说方括号是另一个标点符号,就像你的sep参数一样。您可能希望在某个级别将它们作为附加参数传递。似乎可以将它们作为参数添加到sepConcat - 然后它将处理所有标点符号。

修改:将sep作为不同的值传递不会有帮助。分隔符在字符串之间。根据您的描述,您希望额外的括号绕过结果的外部。不是分隔符。

修改"字符不属于字符串。它们是OCaml向您展示值为字符串的方式。

# let x = "a";;
val x : string = "a"
# x;;
- : string = "a"
# String.length x;;
- : int = 1
#

解释器打印时,任何字符串值都会在其周围。所以方括号不可能在它们之外!

答案 1 :(得分:2)

stringOfList更改为

    let stringOfList f l = 
         let str = sepConcat  "; " (List.map f l) in
         "["^str^"]"

   # stringOfList string_of_int [1;2;3;4;5];;
   - : string = "[1; 2; 3; 4; 5]"