2011-12-27 14 views
5

Esta es una tupla que he tomadoExtraer primer elemento de la tupla usando "FST" lanzar un error "No coinciden los tipos"

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

or 

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

Cuando compilo esto que me está mostrando el siguiente salida

> 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 

Pero cuando doy tupla con dos valores de cadena, funciona bien.

Respuesta

7

La firma de fst es , es por eso que recibe el error dado.

La función fst espera una tupla de dos elementos de cualquier tipo, pero le ofrece una tupla de tres elementos. Para tupla de tres cuerdas el error sería el mismo: fst ("a","b","c") rendirá

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 
+0

Muchas gracias :-) – Exception

6

usted debería ser capaz de hacer let name, _, _ = person para obtener el nombre de la triple.

EDIT: no se puede utilizar fst en el triple porque la firma de fst es la siguiente: fst : 'T1 * 'T2 -> 'T1

+0

Muchas gracias wilx :-). – Exception

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" 
+0

Aunque esto funciona, es extremadamente lento, tipo inseguro y no idiomático. –

+0

inseguro? Que significa ? – BLUEPIXY

+0

El resultado es de tipo 'obj' que lanzas a otro tipo usando' unbox' en el exterior. Si obtiene el tipo incorrecto obtendrá un error de tipo en tiempo de ejecución y no en tiempo de compilación porque su uso de la reflexión elude el sistema de tipo estático, es decir, F # no puede probar la exactitud del código a este respecto en tiempo de compilación. –

0

Sé que este hilo es muy antiguo y con toda honestidad, me gusta la respuesta de WILX mejor, pero desde nadie ha mencionado el uso de match ...

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

o, si lo prefiere

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