2017-05-25 61 views

回答

1

虽然杰弗里的答案是正确的,使用适当的库(在这种情况下,序列),您可以得到与简单和语义类似的Haskell风格:

module S = Sequence 
let sum = S.fold (+) 0 
let f x = S.filter (fun i -> x mod i = 0) S.(1 -- (x-1)) 
let perfect n = S.filter (fun x -> sum (f x) = x) S.(1 -- n) 
1

您正在使用许多(非常好)的Haskell功能,OCaml中不存在这些功能。

对于列表解析,您可以使用List.filter

对于符号[x .. y]您可以使用此范围功能:

let range a b = 
    let rec go accum i = 
     if i > b then List.rev accum else go (i :: accum) (i + 1) 
    in 
    go [] a 

对于sum您可以使用此:

let sum = List.fold_left (+) 0 
+0

小细节:从b到a的负向会避免List.rev列表的额外遍历:) – ghilesZ

+0

是的,我后来想到了这一点。谢谢! –