Я учу себя OCaml, а основные ресурсы, которые я использую для практики, - это некоторые проблемы, которые Cornell предоставил из своего класса 3110. Одна из проблем заключается в том, чтобы написать функцию для инвертирования int (i.e: 1234 -> 4321, -1234 -> -4321, 2 -> 2, -10 -> -1 и т. Д.).Реверсирование int в OCaml
У меня есть рабочее решение, но я обеспокоен тем, что это не совсем идиоматические 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
Он работает должным образом во всех случаях, насколько я могу сказать, но это только кажется, серьезно " un-OCaml ", особенно потому, что я пробегаю длину int дважды с двумя внутренними функциями. Поэтому мне просто интересно, есть ли способ «OCaml» сделать это.
Почему не int -> string -> char array -> reverse array array -> string -> reverseed int? Это не OCaml, но я делал аналогичные вещи в SML/NJ (используя implode и explode, которого, похоже, не хватает OCaml) во время игры с https://en.wikipedia.org/wiki/Lychrel_number. Объединение простых преобразований довольно идиоматично в функциональном программировании. Это может привести к нескольким проходам над данными, но «избегать преждевременной оптимизации» является хорошим советом при изучении языка. –
Я не вижу ничего однообразного в вашем решении. Вероятно, есть несколько более умных решений, но это другой вопрос. –