2012-09-26 3 views
4

J'ai une fonction Ocaml qui me donne des erreurs.Fonction de création de liste récursive. Erreurs dans le type

Ce que je suis en train de faire:

créer récursive une liste de nombres aléatoires (0-2) de taille « limite ».

Voici ce que j'ai:

let rec carDoorNumbers = fun limit -> 
match limit with 
| [1] -> Random.int 3 
| [] -> Random.int 3 :: carDoorNumbers (limit-1);; 

Je reçois cette erreur:

Error: This expression has type 'a list 
    but an expression was expected of type int 

Répondre

3

Pensez à ce que votre fonction doit faire: étant donné une limite, vous devez créer un liste des nombres. Donc, votre type est quelque chose comme carDoorNumbers : int -> int list. En regardant cela, il semble que vous ayez deux erreurs. Tout d'abord, vous faites correspondre limit (qui devrait être un int) contre un modèle de liste. [1] -> ... correspond à une liste contenant uniquement l'élément 1 et [] correspond à la liste vide; vous voulez vraiment faire correspondre contre le numéro 1 et tout autre nombre n.

La deuxième erreur est que vous renvoyez deux types différents dans votre instruction match. Rappelez-vous que vous êtes censé rendre une liste. Dans le premier cas, vous renvoyez Random.int 3, qui correspond à int plutôt qu'à int list. Ce que vous voulez vraiment revenir ici est quelque chose comme [Random.int 3].

L'erreur que vous avez est un peu déroutant. Depuis la première chose que vous avez retourné était un int, il attend votre deuxième chose à aussi être un int. Cependant, votre deuxième cas était réellement correct: vous faire retourner un int list! Cependant, le compilateur ne sait pas ce que vous vouliez dire, donc son erreur est en arrière; plutôt que de changer le int list en int, vous devez remplacer le int par un int list.

+0

D'accord, cela a du sens. Pour mon deuxième cas, au lieu de comparer à une liste vide [], comment pourrais-je l'utiliser pour toutes les autres possibilités de limite (je suppose que c'est un pos #)? –

+0

L'argument est un nombre. Vous voulez faire correspondre * tout * nombre (sauf 1, mais cela correspond à la casse précédente).Vous pouvez le faire avec le motif le plus simple 'n', qui correspond à n'importe quoi et le lie à la variable' n'. (Vous pouvez naturellement nommer la variable que vous voulez.) –

2

Votre match traite d'expression limite comme une liste. Les deux [1] et [] sont des listes. C'est ce que le compilateur vous dit. Mais il semble que la limite devrait être un entier.

Pour correspondre à un entier, utilisez simplement une constante entière. Pas de crochets.

(En aparté, vous voudrez peut-être que la fonction fonctionne bien lorsque vous passez 0)

+0

Oui Oui, je ne comptabilise pas toutes les entrées, en supposant pos. entiers. Merci, je vais enlever les crochets. Comment faire fonctionner le second cas pour chaque "limite" possible sauf 1? Plus j'y pense, plus je pense avoir besoin d'instructions if/else. –

+1

Le modèle "wild card" est '_', ce qui fonctionnera pour ce code. Il n'y a aucun mal à utiliser 'if/then/else' dans OCaml. C'est ce que j'utilise habituellement pour les ints. –

+0

Merci beaucoup, le _ a travaillé comme un charme! –

Questions connexes