2012-10-26 52 views
0

我得到一些錯誤的基地和f和l函數,我錯了什麼錯誤?OCaml concat stringlist使用List.fold_left

函數應該做的例子是。

# 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 
+0

我正在編譯我試過「」,0和空格,但沒有任何東西可以解決它。 –

+0

PSA:在考試期間手邊不會有stackoverflow :) –

回答

2

您與您的代碼得到的錯誤是下面的,在你的代碼在base指出:

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

是什麼意思?問題是什麼?你如何解決它?

另一個問題是您的遞歸調用sepConcat。您是使用fold_left還是正在編寫遞歸函數?如果你正在做這些事情之一,你不需要做其他事情。

+0

我必須遵循骨架,所以我需要遞歸sepConcat並調用List.fold_left,我不確定基本情況的事情,因爲已經有| [ ] - >那麼我應該把什麼東西放入基本案例? –

+0

骨架沒有'sepConcat'上的遞歸調用,你添加了它。 – gasche

+0

事實上,沒有必要使sepConcat遞歸函數。 – didierc

0

下面是使用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"