2010-09-24 4 views
2

J'ai une mission où je dois mettre en œuvre des chiffres de l'église en utilisant le SML datatype: datatype 'une église = C (' un -'A) * 'a ->' aSML et les chiffres église

I avoir à écrire la fonction créer: int -> « une église et une fonction churchToint jusqu'à présent, j'ai le code suivant:

datatype 'a church = C of ('a -> 'a) * 'a -> 'a 
val ZERO = C(fn (f,x) => x) 
fun subCreate 0 (f,x) = x 
    | subCreate n (f,x) = f (subCreate (n-1) (f,x)) 
fun create n = C(fn (f,x) => subCreate n (f,x)); 
fun churchToInt cn = cn (fn x => x + 1) 0; 

Je sais que je suis assez proche. Pouvez-vous s'il vous plaît m'aider à mettre en œuvre correctement? Merci

Répondre

2

Vous avez raison, vous êtes assez proche. Il n'y a que deux erreurs mineures dans votre fonction churchToInt:

  1. Vous ne déballez pas le numéro de l'église. C'est à dire. vous traitez votre argument cn comme une fonction, mais churchToInt devrait accepter un Ccontenant une fonction, pas une fonction elle-même. Donc, changez-le en fun churchToInt (C cn) =, pour déballer la fonction via la correspondance de motif.

  2. Vous appliquez deux arguments à la fonction en utilisant le style curry, mais C a été défini pour contenir une fonction prenant un tuple. Donc, au lieu de cn (fn x => x+1) 0, écrivez cn ((fn x => x+1), 0).

Avec ces deux modifications, votre code fonctionne correctement.

+0

Je l'ai fait cependant est toujours get churchToInt: int église -> int au lieu de 'une église. Et en plus, quand je cours par exemple: créer 5; J'obtiens: "Les voitures de type avertissement non généralisées à cause de la restriction de valeur sont instanciées aux types factices (X1, X2, ....) val it = C fn:? .X1 église" – duby12

+0

@tester: Bien sûr le type est ' int église -> int'. Si le type était '' a church -> int', vous ne seriez pas autorisé à passer une fonction de type 'int -> int'. Si l'affectation vous oblige vraiment à définir une fonction de type ''une église -> int', j'ose dire qu'elle n'est pas soluble - du moins pas avec la définition de type donnée. – sepp2k

+0

mais qu'en est-il de la fonction create, je veux dire que ça marche par exemple churchToInt (create 5) renvoie 5 mais à chaque fois que je lance create, ça continue de me donner cette étrange erreur – duby12