Question

Je suis nouveau dans ML et j'ai essayé des fonctions simples, mais j'ai du mal à essayer d'obtenir des fonctions pour travailler avec des nombres réels. Par exemple, cette fonction inverse ....

    fun reverse (nil) = nil
      | reverse (x::xs) = if xs = nil then [x]
                         else (reverse xs) @ [x];

J'obtiens la sortie de la propriété pour les entiers et les chaînes.

    - reverse [1,2,3,4];
    val it = [4,3,2,1] : int list
    - reverse ["a" , "b" , "c" , "d" ];
    val it = ["d","c","b","a"] : string list

Quelqu'un peut-il m'expliquer pourquoi cette fonction ne fonctionnera pas avec des nombres réels?

Voici la sortie lorsque j'essaie les vraies ...

    - reverse [1.0, 2.0];
    stdIn:1.2-53.9 Error: operator and operand don't agree [equality type required]
      operator domain: ''Z list
      operand:         real list
      in expression:
        reverse (1.0 :: 2.0 :: nil)
Était-ce utile?

La solution

real n'est pas un type d'égalité en ML, et donc les types polymorphes ne sont donc pas non plus construits à partir de reals - en particulier, real listS ne sont pas des types d'égalité, et vous ne pouvez donc pas utiliser l'opérateur = Pour comparer deux real listS, même si ces listes sont vides. Au lieu de cela, vous devez correspondre à des motifs. Par exemple,

fun reverse [] = []
  | reverse (x::xs) = (reverse xs) @ [x]

ou

fun reverse [] = []
  | reverse (x::xs) = case xs of
                           [] => [x]
                         | _ => (reverse xs) @ [x]

fonctionnera même pour les types non quantitatifs.

(Alternativement, utilisez la fonction intégrée List.rev.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top