2017-02-09 1 views
0

Ich habe eine Liste von Listen in OCaml, die [[7; 5]; [7; 3; 2]] zurückgeben. Ich weiß, es gibt eine Menge von List Funktionen in OCaml. Ich möchte jeden Wert mit einem Pluszeichen zwischen ihnen drucken, wie man es in Python oder Ruby machen würde. In Python mache ich das mit print('+'.join(map(str,lst))) wo lst ist die Liste, str ist in eine Zeichenfolge zu konvertieren. Wie mache ich das in OCaml?Wie man List.map in OCaml verwendet

Konsoleneingabe

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

Konsolenausgabe

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)) ;; 

Ich habe eine Wrapperfunktion main. Es ruft alle 3 Funktionen auf, damit alles funktioniert. Der Interpreter gibt mir jedoch einen ungebundenen Wert num. prime_part ist eine Funktion, die die verkettete Liste zurückgibt, wie in der Konsoleneingabe gezeigt. all_primes ist eine Funktion, die als Eingabe für prime_part dient. Wie kann ich diese Funktionen als Eingabe für die print_linked_list Funktion bereitstellen?

+0

Was ist die Verbindung zwischen dem Eingang und dem Konsolenausgang? '4',' 1' und '6' scheinen aus dem Nichts zu kommen. – gallais

+1

Sie waren nur Zufallszahlen. Ich habe den Beitrag korrigiert, um dies zu korrigieren. – technogeek1995

Antwort

4

Hier ist eine Funktion, die ein int list list mit Pluszeichen druckt:

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

Hier ist, wie es für Ihr Beispiel aussieht:

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

Nun, lassen Sie uns zuerst einen Weg finden, eine einzelne Liste zu nehmen und sie mit einem + Zeichen zu verbinden. Wir können dies durch einfache Rekursion tun. Eine Implementierung könnte wie folgt aussehen:

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 "" 

Jetzt, da wir dieses Stück des Puzzles haben, brauchen wir nur diese in der Liste auf jede der Listen anzuwenden.

Hier können wir die List.fold_left Funktion verwenden, um über unsere Liste von Listen zu iterieren und unsere neue Liste von Strings aufzubauen, während wir weitermachen.

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

So ist unser Endprodukt etwas würde wie folgt aussehen:

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

Die Methode str.join entspricht OCamls String.concat. So ist Python

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

Karten

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

Gleiche wie join, die concat Funktion funktioniert nur auf Listen von Zeichenketten, also, wenn wir die Werte eines anderen Typs haben wir sie auf String-Karte sollte. Im Gegensatz zu Python hat OCaml keine str-Funktion, die für alle Werte funktioniert, da OCaml im Allgemeinen keinen so genannten Ad-hoc-Polymorphismus unterstützt. Für jeden Typ gibt es eine separate Funktion, die ihn in seine String-Repräsentationen umwandelt. Zum Beispiel für Ganzzahlen ist es die string_of_int Funktion.Also, der Python-Code folgende

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

Kann in OCaml übersetzt werden, wie folgt:

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

Wir es zu einer Funktion verallgemeinern kann

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

Mit einer solchen generische Funktion können wir leicht lösen Sie Ihr Problem:

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) 

z. B.

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