Functional programming 示例F#:求1000以下所有奇数平方的和

Functional programming 示例F#:求1000以下所有奇数平方的和,functional-programming,higher-order-functions,Functional Programming,Higher Order Functions,我目前正在对语言F#、Haskell和Rust做一个小的比较。 这个比较的一部分包含用每种语言编写的“查找1000以下所有奇数平方和”示例 我对每种语言都有一段代码(对于rust,我从在线指南中获取): F#: 让奇数之和=乐趣极限->[0..limit] |>List.map(乐趣n->(n*n)) |>List.takeWhile(乐趣n_平方->n_平方List.filter(乐趣n_平方->奇数n_平方) |>List.fold(趣味acc n_squared->acc+n_square

我目前正在对语言F#、Haskell和Rust做一个小的比较。 这个比较的一部分包含用每种语言编写的“查找1000以下所有奇数平方和”示例

我对每种语言都有一段代码(对于rust,我从在线指南中获取):

F#:

让奇数之和=乐趣极限->[0..limit]
|>List.map(乐趣n->(n*n))
|>List.takeWhile(乐趣n_平方->n_平方<限制)
|>List.filter(乐趣n_平方->奇数n_平方)
|>List.fold(趣味acc n_squared->acc+n_squared)0
哈斯克尔:

sum\u odd=\limit->foldr(+)0(takeWhile(
锈蚀:

let sum_squared_odd=| limit:u32 |->u32
{ 
(0...map(|n | n*n)
.take_while(|&n|u平方| n|u平方<极限)
.filter(|和n|u平方|是奇数(n|u平方))
.折叠(0,| acc,n|u平方| acc+n|u平方);
}
我还有一些问题,希望有人能给我澄清一下:D

  • 一旦列表中的项大于上限(在映射中),是否有任何方法可以停止对它们进行平方处理?我觉得必须有一些变通办法,但我找不到

  • 提前谢谢你。

    请每篇文章问一个问题。你问的是哪种语言的问题?Haskell很懒,所以它会尽快停止使用方块。无需更改Haskell代码。(尽管如此,这类代码与其他语言有点不同:您在Haskell中比其他语言更早地进行过滤)作为旁注,所有奇数平方和(直到
    2*n-1
    都是
    n*(4*n^2-1)/3
    ,这可以用来简化计算。(我知道这可能不是你练习的重点。)在F中,要实现惰性语义,请使用
    Seq
    而不是
    List
    let sum_of_odd = fun limit -> [0 .. limit] 
    |> List.map (fun n -> (n * n)) 
    |> List.takeWhile (fun n_squared -> n_squared < limit) 
    |> List.filter (fun n_squared -> is_odd n_squared) 
    |> List.fold (fun acc n_squared -> acc + n_squared) 0