Mi sto insegnando da solo a OCaml e le risorse principali che uso per la pratica sono alcuni problemi che Cornell ha reso disponibili dalla loro classe 3110. Uno dei problemi è scrivere una funzione per invertire un int (cioè: 1234 -> 4321, -1234 -> -4321, 2 -> 2, -10 -> -1 ecc.).Inversione di un int in OCaml
ho una soluzione di lavoro, ma sono preoccupato del fatto che non è esattamente idiomatica OCaml:
let rev_int (i : int) : int =
let rec power cnt value =
if value/10 = 0 then cnt
else power (10 * cnt) (value/10) in
let rec aux pow temp value =
if value <> 0 then aux (pow/10) (temp + (value mod 10 * pow)) (value/10)
else temp in
aux (power 1 i) 0 i
Funziona correttamente in tutti i casi, per quanto posso dire, ma sembra proprio sul serio " un-OCaml "per me, soprattutto perché sto attraversando la lunghezza dell'int due volte con due funzioni interne. Quindi mi chiedo se c'è un modo più "OCaml" per farlo.
Perché non int -> string -> char array -> inverso char array -> string -> reverse int? Non è OCaml, ma ho fatto cose simili in SML/NJ (usando implode ed esplodi che a OCaml sembra mancare) mentre gioco con https://en.wikipedia.org/wiki/Lychrel_number. Il concatenamento di trasformazioni semplici è abbastanza idiomatico nella programmazione funzionale. Potrebbe comportare più passaggi sui dati, ma "evitare l'ottimizzazione prematura" è un buon consiglio quando si impara una lingua. –
Non vedo nulla di non convenzionale sulla tua soluzione. Ci sono probabilmente alcune soluzioni più intelligenti, ma questa è una domanda diversa. –