Functional programming 在OCaml中反转int

Functional programming 在OCaml中反转int,functional-programming,ocaml,Functional Programming,Ocaml,我在自学OCaml,我在实践中使用的主要资源是康奈尔大学在3110课上提供的一些习题集。其中一个问题是编写一个函数来反转int(即:1234->4321,-1234->-4321,2->2,-10->-1等) 我有一个可行的解决方案,但我担心它不是完全惯用的OCaml: let rev_int (i : int) : int = let rec power cnt value = if value / 10 = 0 then cnt else power (10 * cnt

我在自学OCaml,我在实践中使用的主要资源是康奈尔大学在3110课上提供的一些习题集。其中一个问题是编写一个函数来反转int(即:1234->4321,-1234->-4321,2->2,-10->-1等)

我有一个可行的解决方案,但我担心它不是完全惯用的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
让rev_int(i:int):int=
让rec为cnt值加幂=
如果值/10=0,则cnt
其他功率(10*cnt)(值/10)英寸
让记录辅助功率温度值=
如果值为0,则为辅助(功率/10)(温度+(功率值mod 10*pow))(功率/10)
其他临时雇员
辅助(电源1 i)0 i

据我所知,它在所有情况下都能正常工作,但对我来说,它似乎是严重的“unocaml”,特别是因为我用两个内部函数两次遍历int的长度。所以我只是想知道是否有一种更“OCaml”的方法来实现这一点

我可以向您推荐一些方法:

let decompose_int i =
  let r = i / 10 in
  i - (r * 10) , r
这个函数允许我像分解列表一样分解整数。 例如,
1234
被分解为
4
123
。 然后我们把它倒过来

let rec rev_int i = match decompose_int i with
  | x , 0 -> 10 , x
  | h , t ->
    let (m,r) = rev_int t in
    (10 * m, h * m + r)
这里的想法是返回
10
100
1000
。。。以此类推,以知道最后一位数字的位置



我想在这里做的是像对待列表一样对待它们,
将int分解为
List.hd
List.tl
等价物。

(* [rev x] returns such value [y] that its decimal representation
   is a reverse of decimal representation of [x], e.g., 
   [rev 12345 = 54321] *)
let rev n = 
  let rec loop acc n =
    if n = 0 then acc 
    else loop (acc * 10 + n mod 10) (n / 10) in
  loop 0 n
但正如杰弗里在评论中所说,你的解决方案非常地道,尽管不是最好的

顺便说一句,我自己的风格是这样写的:

let rev n = 
  let rec loop acc = function
    | 0 -> acc
    | n -> loop (acc * 10 + n mod 10) (n / 10) in 
  loop 0 n

因为我更喜欢模式匹配而不是
if/then/else
。但这是我个人喜好的问题。

为什么不使用int->string->char-array->reversed char-array->string->reversed int?它不是OCaml,但我在SML/NJ中做过类似的事情(使用OCaml似乎缺少的内爆和爆炸),同时也在玩。将简单的转换链接在一起在函数式编程中是相当惯用的。这可能需要多次传递数据,但在学习一门语言时,“避免过早优化”是一个很好的建议。也许还有一些更聪明的解决方案,但这是另一个问题;这与我的设想是一致的。关于其他答案,我可能应该在我的帖子中提到,我试图避免使用“内置”函数,如string of int。