你如何访问作为歧视联盟的元组中的项目?

时间:2016-09-06 23:59:39

标签: f#

假设我声明一个类似的类型:

type Kvp = Kvp of string * int

我创建了它的实例

let inst = Kvp("twelve", 12)

如何从inst获取第一个和第二个值? Fst和snd不工作:

fst inst;;
stdin(81,5): error FS0001: This expression was expected to have type
    'a * 'b
but here has type
    Kvp

2 个答案:

答案 0 :(得分:3)

正如s952163所提到的,模式匹配就是你想要的。但是,很好的语法是这个

type Kvp = Kvp of string * int
let inst = Kvp("twelve", 12)

let (Kvp (str,i)) = inst 
// val str : string = "twelve"
// val i : int = 12

您也可以使用_丢弃您不想要的内容:

let (Kvp (str,_)) = inst

Here's the F# for fun and profit page on Single Case DUs

答案 1 :(得分:2)

因为DU不是元组,所以你会得到错误。但是你可以在DU上进行模式匹配:

type Kvp = Kvp of string * int
let inst = Kvp("twelve", 12)

let (a,b) = 
    match inst with
    | Kvp(a,b) -> (a,b)
//val b : int = 12
//val a : string = "twelve"

F# Fun中间的某个地方有一个匹配函数的例子。