2010-09-20 11 views
4

Je suis nouveau à SML, et je me demandais comment obtenir un élément dans une liste de tuples. Par exemple, dans la liste [("abc", 4), ("def", 6)], comment pouvez-vous extraire "abc"? J'ai essayéComment manipulez-vous une liste de tuples dans SML?

x::xs => #1(x) 

mais je continue à obtenir "enregistrement flex non résolu". Aucune suggestion?

Répondre

2

Vous pouvez simplement l'extraire en utilisant la correspondance de modèle.

let 
    val lst = [("abc", 4), ("def", 6)] 
in 
    case lst of (str,_)::xs => str 
       | [] => "The list is empty" 
end 

Renvoie "abc".

5

L'erreur que vous étiez est parce que des choses comme #1 sont un peu spécial et son type dépend de ce qu'il est utilisé. Par exemple, dans #1 (1,2), le type de #1 est 'a * 'b -> 'a; tandis que dans #1 (1,2,3), le type de #1 est 'a * 'b * 'c -> 'a. Il n'y a pas de type comme 'a * ... -> 'a qui fonctionnera pour tout, donc le compilateur doit être capable de comprendre le type sur lequel il sera utilisé (en gros, combien d'éléments sont dans le tuple).

Donc cela ne fonctionne pas:

fun f lst = 
    case lst of x::xs => #1 x 
      | [] => "The list is empty" 

parce qu'il sait juste qu'il est « une sorte de liste », et x est « une valeur d'un certain type ». Mais il ne sait pas quel type de tuple c'est.

ajoutant simplement un agent de type ou un autre contexte qui permet au compilateur de dire quel genre de tuple il est, fonctionnera:

fun f (lst : (string * 'a) list) = 
    case lst of x::xs => #1 x 
      | [] => "The list is empty" 
1

vous pouvez avoir une fonction pour obtenir une valeur de tuple, comme:

fun getname(name:string, x:int) = name; 

si vous avez la liste:

val lst = [("abc", 4), ("def", 6)] 

alors, vous pouvez extraire le nom de e e premier tuple (HD) en faisant:

getname(hd lst) 

sera de retour "abc"

4

je l'extraire comme ceci:

fun foo ((x,y)::xs) = x; 

afin que vous extraire tuple de la liste et se lient x à abc et y à 4, puis retournez simplement x. comme vous pouvez également fusionner les tuples et retourner une liste de chaînes seulement:

fun f [] = [] 
    | f ((x,y)::xs) = x^Int.toString(y) :: f(xs); 

serait, compte tenu de la liste [("abc",4),(def",6)], retourner la liste ["abc4","def6"]