这是我采取的元组
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
但是当我给两个字符串值的元组时它工作正常。
答案 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