获取元组选项类型变量的值?

时间:2013-09-20 15:21:20

标签: f# f#-3.0

我有以下F#代码。函数getARow返回(string * string * string) option。在main函数中,我需要提取列值并分别将它们分配给a, b, c。怎么实现呢? (新手问题)

如果没有找到行,该函数可能会返回null?如果getARow返回null,如何处理它?<​​/ p>

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

1 个答案:

答案 0 :(得分:7)

要从选项类型中提取值(无论它包含什么),您需要使用Some <...>模式,其中<...>是一个嵌套模式,可以为该值指定名称(如果您想要一个包含元组的变量)或进一步分解它(如果你想要三个单独的变量):

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如果没有行则返回null - 这将起作用,因为nullNone的内部表示。但是你也可以使用an extension that adds headOrNone来使代码更好。