2017-01-26 1 views
0

Ce qui suit est une façon de déclarer une fonction je suppose (corrigez-moi) & Je veux faire quelque chose de similaire en utilisant le même style mais ça ne fonctionne pas, pourquoi?Déclaration de fonction en SML?

fun length nil = 0 
| length (_::l') = 1 + (length l') 

Je veux le faire sans utiliser la syntaxe "case expression of". i.e. si la fonction x obtenir un numéro 3 puis retourner 0 sinon s'il est 4 alors 1

fun x 3 = 0 
| x (4) = 1 

Here's the error 
stdIn:58.5-59.12 Warning: match nonexhaustive 
    3 => ... 
    4 => ... 

Q2) De plus, où est le corps de la fonction démarrage? il semble que nil est un paramètre, mais nous avons | donc je suis confus!

+1

Quel est le problème avec la définition que vous avez publié? (Lisez à propos de la correspondance de modèles dans n'importe quel livre que vous utilisez.) – molbdnilo

+0

C'est juste un exemple simple pour la récursivité. cette fonction a le type 'a list -> int. C'est tout ce qui est écrit à ce sujet. –

+1

Je veux dire votre fonction. Vous dites "ça ne marche pas" - qu'est-ce qui ne va pas? – molbdnilo

Répondre

2

Il est une définition avec correspondance de motif, et cela signifie la même chose que

fun length ls = case ls of 
        nil => 0 
        | _::l' => 1 + (length l') 

mais est plus concis et facile à lire.

Vous obtenez un avertissement sur votre fonction car vous ne faites que correspondre 3 et 4 mais aucun autre entier.

Vous obtiendrez le même avertissement si vous écrivez

fun x n = case n of 
       3 => 0 
      | 4 => 1 

assortis toutes les valeurs possibles se débarrasser de l'avertissement:

fun x 3 = 0 
    | x 4 = 1 
    | x _ = 2