f#查询方程式

时间:2017-03-11 03:53:11

标签: f# sum equations

我正在处理一些代码,我需要使用f#查询来汇总列表。

对于正在处理f#basics的人来说,这里有一个方便的链接:https://learnxinyminutes.com/docs/fsharp/

到目前为止,我的代码打印了一个5个数字的平方和的语句。

到目前为止,这正确显示3000作为每个列表的平方和。 '数字'将用于查询。

let square x = x * x
let numbers = [10.0; 20.0; 30.0; 40.0]

let sumOfSquare2 =
   [10.0; 20.0; 30.0; 40.0] 
   |> List.map square 
   |> List.sum 

printfn "Sum of square: %A" (sumOfSquare2)

let sumOfSquare = 
    List.sum ( List.map square [10.0; 20.0; 30.0; 40.0] )

printfn "Sum of square: %A" (sumOfSquare)

目前,我对如何正确使用' square'查询后的函数。

// A query expression.

let query1 =
    query {
        for number in numbers do
            select (number)           
    }
   |> square query   


printfn "Query sum of squares: %A" (query1)

那么我该如何正确呈现呢? '查询'本身是有效的(当在查询中使用printfn时)但是当试图将square函数传递给查询时,它不会编译。

3 个答案:

答案 0 :(得分:2)

它与list使用的代码基本相同,但由于查询返回seq使用Seq.map而不是List.map

// A query expression.
let query1 =
    query {
        for number in numbers do
            select (number)           
    }
   |> Seq.map square    


printfn "Query sum of squares: %A" (query1)

请注意,您的查询不会转换任何内容,但我认为您确实喜欢这样做。

答案 1 :(得分:1)

请注意,查询返回一个序列,您可以迭代然后执行操作

例如:

// Print results of a query
query1
|> Seq.map (fun customer -> printfn "Company: %s Contact: %s" customer.CompanyName customer.ContactName)

您可以像以下一样使用它:

query1 |> Seq.map (fun e -> square(e)) |> Seq.sum

完整源代码

open System

// your code goes here
let square x = x * x
let numbers = [10.0; 20.0; 30.0; 40.0]

let query1 =
    query {
        for number in numbers do
            select (number)           
    } |> Seq.map square |> Seq.sum

Console.WriteLine(sprintf "%A" query1);

Try it

要详细了解该查询,请转到https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/query-expressions

答案 2 :(得分:1)

F#支持在查询中求和,所以你可以这样做来得到正方形的总和:

query {
    for num in numbers do
    sumBy (square num)
}