2017-07-13 4 views
0
Datatype events = enter of string * real | exit of string *real; 

J'ai donc ce type de données et je dois écrire une fonction qui prend une liste d'événements en entrée et renvoie cette liste triée par la partie réelle des événements. J'ai essayé d'écrire certaines fonctions, mais je n'ai pas trouvé de bonnes idées?Liste de types de données SML standard

c'est le code i essayé:

val rec ordina = fn 
    [] => [] 
    |v1::v2::l => if (#2(v2)) > (#2(v1)) 
        then ordina (v1::l) 
        else oridna (v2::1); 

Erreurs j'ai obtenu:

poly: erreur: Impossible de trouver un type d'enregistrement fixe. Trouvé près de # 2

poly: erreur: Impossible de trouver un type d'enregistrement fixe. Trouvé près # 2

+0

Quelles fonctions avez-vous essayé d'écrire? Quelles erreurs avez-vous rencontrées? Si vous voulez de l'aide pour vos devoirs, alors vous devriez montrer vos efforts. –

+0

J'ai posté le code que j'ai essayé d'utiliser. –

+0

La macro '# 2' fonctionne sur les tuples, mais' Enter (s, r) 'et' Exit (s, r) 'ne sont pas directement des tuples. Vous devriez faire une fonction getter comme je le suggère dans ma réponse ci-dessous. Que vous utilisiez un pattern entièrement, comme je le suggère, ou que vous écrivez 'fun get _... (Entrez la paire) = # 2 paire | ... 'sont les deux options. –

Répondre

1

Certains commentaires,

  • La déclaration de type de données devrait probablement être

    datatype event = Enter of string * real 
           | Exit of string * real 
    

    Une valeur unique contient un seul événement.

    Le pluriel est obtenu en ayant une valeur de par ex. tapez liste d'événements.

    Les constructeurs de valeurs sont généralement écrits avec une lettre de début majuscule. SML/NJ vous avez une fonction de tri générique appelée ListMergeSort.sort. Il prend une fonction avec le type 'a *' a -> bool'a = événement dans ce cas. Vous pouvez alors écrire une fonction,

    fun cmp_event (event_a, event_b) = ... 
    

    qui retourne si event_a devrait commander avant event_b en fonction de leurs réelles parties. Indice: Tout d'abord, créez une fonction d'aide qui extrait la pièce réelle. (Venez avec un meilleur nom qui reflète le but de la partie réelle.)

    fun get_real_part (Enter (_, r)) = ... 
        | get_real_part ... = ... 
    
  • Si vous n'êtes pas autorisé à utiliser ListMergeSort.sort, puis make your own sort.