Извлечение первого элемента из кортежа с использованием «fst», выдающего ошибку «несоответствие типов» - PullRequest
5 голосов
/ 27 декабря 2011

Это кортеж, который я взял

 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 ]

7 голосов
/ 27 декабря 2011

Подпись 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
6 голосов
/ 27 декабря 2011

Вы должны быть в состоянии сделать let name, _, _ = person, чтобы получить имя из тройки.

РЕДАКТИРОВАТЬ: Вы не можете использовать fst в тройке, потому что подпись fstэто: fst : 'T1 * 'T2 -> 'T1

2 голосов
/ 27 декабря 2011
> 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"
0 голосов
/ 17 июня 2015

Я знаю, что эта ветка очень старая и, честно говоря, мне больше всего нравится ответ wilx, но, поскольку никто не упомянул об использовании match ...

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

или, если вы предпочитаете

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