3

次の F# コードがあります。関数は をgetARow返します(string * string * string) optiona, b, cメイン関数では、列の値を抽出してそれぞれに割り当てる必要があります。それを実装する方法は?(初心者の質問)

そして、行が見つからない場合、関数は null を返すことがありますか? getARownullを返す場合の処理​​方法は?

open System
open System.Data
open System.Data.Linq
open Microsoft.FSharp.Data.TypeProviders
open Microsoft.FSharp.Linq
open System.Net
open System.IO
open FSharp.Data

type dbSchema = SqlDataConnection<"Data Source=Svr;Initial Catalog=DB;Integrated Security=SSPI;"> 
//, LocalSchemaFile = "Schema.dbml", ForceUpdate = false > 

let getARow =
    let db = dbSchema.GetDataContext()
    db.DataContext.Log <- System.Console.Out
    let query = query { 
        for row in db.Table1 do 
        where (row.SiteID = 1) 
        select (Some(row.Col1, row.Col2, row.Col2)) // All Colx are strings
        headOrDefault // May return null
        }
    query 

[<EntryPoint>]
let main argv = 
    let aRow = getARow
    printfn "%A" aRow 

    let a,b,c = match aRow with
    | ........ // How to let a = Col1, b = Col2 and c = Col3?
    | None -> failwith "Cannot find a row" // Null?
    0
4

1 に答える 1

7

オプション タイプから値を抽出するには (内容に関係なく)、値に名前を付けることができるネストされたパターンであるパターン (タプルを含む単一の変数が必要な場合) を使用するか、さらに分解する必要がありますSome <...>( <...>3 つの個別の変数が必要な場合):

let a,b,c = 
  match aRow with
  | Some(a, b, c) -> a, b, c
  | None -> failwith "Cannot find a row"

または、組み込みOption.get関数を使用することもできます。

let a,b,c = Option.get aRow

あなたのコードは、行がない場合にheadOrDefault返されるトリックに依存しています。ただし、追加する拡張機能を使用して、コードを少し良くすることもできます。nullnullNoneheadOrNone

于 2013-09-20T15:27:30.560 に答える