我正在处理一些代码,我需要使用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函数传递给查询时,它不会编译。
答案 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);
要详细了解该查询,请转到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)
}