2017-03-11 17 views
3

私はリストを合計するためにf#クエリを使用する必要があるいくつかのコードに取り組んでいます。 F#の基礎に取り組んでいる人のためf#式の方程式

は、ここに便利なリンクです:https://learnxinyminutes.com/docs/fsharp/

これまでのところ、私は5つの数字の二乗和のための文を出力するコードを持っています。

これまでのところ、3000が各リストの2乗の合計として正しく表示されます。クエリには「numbers」が使用されます。

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) 

現時点では、クエリの後に「四角形」関数を正しく使用する方法が少し残っています。

// A query expression. 

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


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

これを正しく表示するにはどうすればよいですか? 'query'自体は動作しますが(照会で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

クエリの詳細については、それはあなたがlistで使用する基本的に同じコードになりますhttps://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/query-expressions

+0

のlet Query1を|> Seq.iter(楽しいE - >四角(E))|> Seq.sumはコンパイルエラーを引き起こします。私は自分の問題にこれをどのように適用するのか本当に分かりません。 リンクした記事を読んでいます。それは私の質問の結果に私の二乗関数を適用している問題を解決しません。 – EidahageFeroe

+0

私はあなたの解決方法を理解しました。これにより、コンパイルエラーが発生します。 のlet Query1を= クエリ{数の数の 行う 選択(数) } |> Seq.iter(楽しいE - >四角(クエリ))|> Seq.sum – EidahageFeroe

+1

あなたはの機能の署名を見れば'Seq.iter'を実行すると、ユニットが返されることがわかります。したがって、一般的に副作用(例えば、スクリーンへの印刷)に使用されます。実際には 'Seq.map'と' Seq.sum'が必要です。クエリは怠惰なseqを返すので、評価を強制的にArrayに渡したいのであれば、 '|> Seq.toList' – s952163

2

に行ってください、しかし、クエリが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の値をどのように追加するのか疑問に思っています(このprint文はリストの各値を二乗して返します)。これをquery1式でパイプライン化する必要がありますか? – EidahageFeroe

+1

@MichaelPottsはあなたの最初の例と同じでなければなりません。seq関数のリスト関数を置き換えるだけです。つまり '' List.sum''の代わりに '' Seq.sum''などを使用します。 – Gustavo

1

F#はあなただけの二乗和を取得するには、この操作を行うことができますので、クエリ内の加算サポートしています。

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