Ocaml 有更好的解决办法吗?

Ocaml 有更好的解决办法吗?,ocaml,higher-order-functions,Ocaml,Higher Order Functions,我正在做一个函数,返回给定数字在int列表中出现的次数。我有一个解决方案,但我觉得这是相当基本的,可以做得更好(也许有比赛和rec??)。我也觉得样式已经关闭了,但是还不太确定如何设置OCaml的样式 代码如下: let num_occurs (n : int) (nums : int list) : int = let x = List.fold_left (+) 0 (List.filter (fun (x : int) -> if x = n then true el

我正在做一个函数,返回给定数字在int列表中出现的次数。我有一个解决方案,但我觉得这是相当基本的,可以做得更好(也许有比赛和rec??)。我也觉得样式已经关闭了,但是还不太确定如何设置OCaml的样式

代码如下:

let num_occurs (n : int) (nums : int list) : int =
  let x = List.fold_left (+) 0 
  (List.filter (fun (x : int) -> 
  if x = n then true else false) nums) in 
  x / n ;;

因此,您所拥有的看起来相当不错,尽管我不确定
x/n
打算做什么。对于OCaml来说,使用List.fold_left和List.filter是一种很好的直觉。不过,要使其更简洁,只需使用List.length!作为奖励,您可以直接使用x=n,而不是使用
if-then-else

let num_occurs (n : int) (nums : int list) : int =
  List.length (List.filter (fun x -> x = n) nums)

我发现我的解决方案存在潜在问题。如果用户输入0作为要计数的整数,这将不起作用。我将继续使用match解决方案。为什么在最后应用x/n?看起来你是在把计数除以数字本身……无论如何,正确的方法可能就是List.length(List.filter(fun x->x=n)nums)——或者类似的,我懒得打开一个终端来检查语法是否正确啊,这很有意义,是的。我明白你现在的想法,这是合理的,但可以简化:)只是一个简短的评论:
如果x=n那么true或者false就是
x=n
,因为这将返回
true
或者
false
作为参考,我在这一页了解OCaml列表函数: