2017-02-09 15 views
0

我有一個OCaml中的列表返回[[7; 5]; [7; 3; 2]]。我知道OCaml中有很多List函數。我想用它們之間的加號打印每個值,就像在Python或Ruby中做的那樣。在Python中,我用print('+'.join(map(str,lst)))這樣做,其中lst是列表,str是要轉換爲字符串。我如何在OCaml中執行此操作?如何在OCaml中使用List.map

控制檯輸入

int list list = [[7; 5]; [7; 3; 2]] 

控制檯輸出

7 + 5 
7 + 3 + 2 

UPDATE

let main num = 
    print_string "Prime Partitions Program" in 
    print_linked_list (prime_part num (all_primes 2 num)) ;; 

我有一個包裝函數main。它調用了所有的3個函數來工作。但是,口譯員給我一個不受限制的價值numprime_part是一個函數,如控制檯輸入中顯示的那樣返回鏈接列表。 all_primes是作爲prime_part的輸入的函數。如何使這些函數作爲輸入輸入到print_linked_list函數?

+0

輸入和控制檯輸出之間的連接是什麼? '4','1'和'6'似乎無處不在。 – gallais

+1

他們只是隨機數字。我已修復帖子以糾正此問題。 – technogeek1995

回答

4

下面是打印與int list list加號功能:

let pll ll = 
    let pl l = 
     print_endline (String.concat " + " (List.map string_of_int l)) 
    in 
    List.iter pl ll 

這裏是它的外觀爲您的示例:

val pll : int list list -> unit = <fun> 
# pll [[7; 5]; [7; 3; 2]];; 
7 + 5 
7 + 3 + 2 
- : unit =() 
1

嗯,首先讓我們試着想一個方法來獲取一個列表並加入一個+字符。我們可以通過簡單的遞歸來完成。一種實現可能是這樣的:

let join_with_plus lst =  
    let rec join lst acc = 
    match lst with 
    | [] -> acc 
    | n :: [] -> acc^(string_of_int n) 
    | n :: rest -> inner_join rest (acc^(string_of_int n)^" + ") 
    in join lst "" 

既然我們有這個難題,我們只需要將它應用於列表中的每個列表。

在這裏,我們可以使用List.fold_left函數遍歷列表的列表,並在我們繼續建立新的字符串列表時建立新的列表。

let stringify_all_lists lst = 
    List.fold_left (fun acc lst -> (join_plus lst) :: acc) [] lst 

因此,我們的最終產品將是這個樣子:

stringify_all_lists [[7; 5]; [7; 3; 2]] 
(* string list = ["7 + 5"; "7 + 3 + 2"] *) 
3

str.join方法對應於OCaml的String.concat。所以python的

"+".join(["1", "2", "3"]) 

映射到

String.concat "+" ["1"; "2"; "3"] 

join,該concat功能將只對字符串列表,所以如果我們有一些其他類型的值,我們應該把它們映射到字符串。與Python不同,在OCaml中沒有可用於所有值的str函數,因爲OCaml通常不支持所謂的ad-hoc多態性。因此,對於每種類型,都有一個單獨的函數將其轉換爲字符串表示形式的值。例如,對於整數,它是string_of_int函數。所以,下面的Python代碼

"+".join(str(x) for x in [1, 2, 3]) 

可以翻譯成OCaml的,如下:

[1;2;3] |> List.map string_of_int |> String.concat "+" 

我們可以把它推廣到功能

let join string_of_element sep xs = 
    xs |> List.map string_of_element |> String.concat sep 

隨着我們可以輕鬆地這樣的通用功能解決您的問題:

let join_ints_with = join string_of_int 
let sum_of_ints = join_ints_with "+" 
let string_of_equations = join sum_of_ints "\n" 
let print_equations eqs = print_endline (string_of_equations eqs) 

例如,

print_equations [[7; 5]; [7; 3; 2]];; 
7+5 
7+3+2