如何在Ocaml中使用list comprenhension

时间:2017-05-25 17:37:47

标签: list haskell ocaml list-comprehension

此代码位于Haskell中。我怎样才能在OCAML中做同样的事情?

perfect n = [x | x<-[1..n], sum(f x) == x]
f x = [i | i<-[1..x-1], x `mod` i ==0]

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

虽然Jeffrey的答案是正确的,但使用适当的库(在本例中为序列),您可以获得与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)