0

我在 base 以及 f 和 l 函数中遇到了几个错误,我错了什么?

该函数应该做什么的例子是。

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

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

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

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

老师给了我这个我应该填写的代码。

let rec sepConcat sep s1 = match s1 with
  |[] -> ""
  |h::t -> 
        let f a x = failwith "to be implemented" in
    let base = failwith "to be implemented" in
    let l = failwith "to be implemented" in
        List.fold_left f base l

我到目前为止

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

2 回答 2

2

您在代码中遇到的错误如下,指向base您的代码:

Error: This expression has type int but an expression was expected of type
       string

这是什么意思?问题是什么?你如何解决它?

另一个问题是您对sepConcat. 您正在使用fold_left还是正在编写递归函数?如果你正在做这些事情中的一件,你就不需要做另一件。

于 2012-10-26T09:41:38.570 回答
1

这是一个使用fold_left和可选参数的实现:

let concat ?(sep="") l =
  List.fold_left (fun acc e -> acc^sep^e) (List.hd l) (List.tl l);;
val concat : ?sep:bytes -> bytes list -> bytes = <fun>

这是另一个使用尾递归函数的实现:

let concat ?(sep="") l =
  let rec loop acc = function
    | [] -> acc
    | h::t -> loop (acc^sep^h) t
  in
  loop (List.hd l) (List.tl l);;
val concat : ?sep:bytes -> bytes list -> bytes = <fun>

两者的行为方式完全相同:

concat ~sep:(" ") ["hello"; "world"];;
- : bytes = "hello world"
于 2017-02-08T11:13:34.057 回答