1
此代碼位於Haskell中。我如何在OCAML中做同樣的事情?如何在Ocaml中使用list comprenhension
perfect n = [x | x<-[1..n], sum(f x) == x]
f x = [i | i<-[1..x-1], x `mod` i ==0]
此代碼位於Haskell中。我如何在OCAML中做同樣的事情?如何在Ocaml中使用list comprenhension
perfect n = [x | x<-[1..n], sum(f x) == x]
f x = [i | i<-[1..x-1], x `mod` i ==0]
雖然傑弗裏的答案是正確的,使用適當的庫(在這種情況下,序列),您可以得到與簡單和語義類似的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)
您正在使用許多(非常好)的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
小細節:從b到a的負向會避免List.rev列表的額外遍歷:) – ghilesZ
是的,我後來想到了這一點。謝謝! –