2017-03-11 64 views
3

我正在一些代碼,我需要使用f#查詢來總結一個列表。f#查詢與方程

對於任何人誰是工作在F#基礎知識,這裏有一個方便的鏈接: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時),但是當試圖將平方函數流水化爲查詢時,它不能編譯。

回答

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

+0

讓QUERY1 |> Seq.iter(樂趣é - >方形(E))|> Seq.sum導致編譯錯誤。我真的不知道如何將這個應用於我自己的問題。 我已閱讀您鏈接的文章。它不能解決我遇到的問題,即將我的平方函數應用於查詢結果。 – EidahageFeroe

+0

以下是我如何理解您的解決方案。這會導致編譯錯誤。 讓QUERY1 = 查詢{ 在數數做 選擇(數量) } |> Seq.iter(樂趣é - >方(查詢))|> Seq.sum – EidahageFeroe

+1

如果你看看函數簽名'Seq.iter',你會看到它返回單位,因此通常用於其副作用(例如打印到屏幕)。的確,你需要'Seq.map'然後'Seq.sum'。查詢返回seq,這是懶惰的,所以如果你想強制它的評價只是管它到Array:'|> Seq.toList' – s952163

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) 

請注意,您的查詢不會轉換任何內容,但我認爲您確實喜歡這個例子。

+0

你好!非常感謝你。這很好。只是想知道我將如何添加query1的值(因爲此打印語句返回每個列表值的平方)。這需要在query1表達式中進行流水線操作嗎? – EidahageFeroe

+1

@MichaelPotts應該和你最初的例子一樣,只需要替換seq函數的列表函數,它就可以工作,而不是''List.sum''使用''Seq.sum''等等。 – Gustavo

1

F#支持查詢中總結,所以你可以做到這一點得到平方和:

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