使用“fst”从元组中提取第一个元素,抛出错误“type mismatch”

时间:2011-12-27 12:12:09

标签: f# tuples

这是我采取的元组

 let person = ("Prathap Reddy SV", "Male", 16)
 let name = fst person   

 or 

 let person = ("Prathap", "Male", 16)
 let name = fst person  

当我编译它时显示以下输出

 > let person = ("Prathap Reddy SV", "Male", 16)
   let name = fst person

   let name = fst person
   ---------------^^^^^^

   stdin(152,16): error FS0001: Type mismatch. Expecting a
   string * string    
 but given a
   string * string * int    
 The tuples have differing lengths of 2 and 3   

但是当我给两个字符串值的元组时它工作正常。

4 个答案:

答案 0 :(得分:7)

fst的签名是('a * 'b -> 'a),这就是您收到指定错误的原因。

函数fst期望一个包含两个元素的元组,但是你提供了一个由三个元素组成的元组。对于三个字符串的元组,错误将是相同的:fst ("a","b","c")将产生

stdin(1,6): error FS0001: Type mismatch. Expecting a
    'a * 'b    
but given a
    'a * 'b * 'c    
The tuples have differing lengths of 2 and 3

答案 1 :(得分:6)

您应该能够let name, _, _ = person从三联中获取名称。

编辑:您无法在三元组上使用fst,因为fst的签名是:fst : 'T1 * 'T2 -> 'T1

答案 2 :(得分:2)

> open Microsoft.FSharp.Reflection;;
> let gfst (tpl:obj) = FSharpValue.GetTupleField(tpl,0);;//index = 0

val gfst : obj -> obj

> let person = ("Prathap Reddy SV", "Male", 16);;

val person : string * string * int = ("Prathap Reddy SV", "Male", 16)

> gfst person |> unbox<string>;;
val it : string = "Prathap Reddy SV"

答案 3 :(得分:0)

我知道这个帖子很老了,老实说,我最喜欢wilx的答案,但是因为没有人提到使用match ......

let name = match person with | (a, _, _) -> a

或者,如果您愿意

let name = 
    match person with
    | (a, _, _) -> a