2010-01-01 7 views
1

Actuellement, mon code ressemble à ceci:Standard ML: comment exécuter une autre fonction dans une fonction?

fun gradImage() = 
    let val iImg = Gdimage.image(640,480) (0,0,0); 
     val void = mapi gradient iImg; 
    in 
     Gdimage.toPng iImg "gradient.png" 
    end; 

mapi est une fonction de type int int> int int * int> image-> unité. Essentiellement, il fonctionne sur l'image fournie.

La fonction est moche avec val vide = ...

Comment pourrais-je éliminer cela?

+0

D'autres me battent à la réponse, donc je vais juste ajouter la note que les points-virgules après le 'val = ...' sont inutiles. J'ai aussi tendance à utiliser un trait de soulignement pour val: 'val _ = mapi', mais ce n'est qu'un style. – ZoogieZork

Répondre

2

Vous pouvez avoir une liste d'expressions entre in et end dans une expression let. Ainsi, vous pouvez réécrire votre code pour

fun gradImage() = 
    let 
     val iImg = Gdimage.image(640,480) (0,0,0) 
    in 
     mapi gradient iImg; 
     Gdimage.toPng iImg "gradient.png" 
    end; 

Je suppose que mapi modifie iImg en place, que le code semble être écrit de cette façon. Cela ne semble pas très fonctionnel; il serait plus naturel d'avoir mapi retourner le image modifié, mais d'après ce que je peux voir de l'interface Gdimage, on dirait comment c'est fait là-bas, et je comprends que c'est probablement mieux du point de vue de l'efficacité.

1

Il y a dix ans que je l'ai utilisé SML, mais je crois que ce que vous cherchez est le suivant:

fun gradImage() = 
    let val iImg = Gdimage.image(640,480) (0,0,0) 
    in 
     ignore (mapi gradient iImg); 
     Gdimage.toPng iImg "gradient.png" 
    end; 
+0

L'appel à 'ignore 'n'est pas réellement nécessaire ici. –

1

Je préfère en fait le type de vérification proposée par

val() = mapi gradient iImg 

supplémentaire Si cela semble laid, il devrait — ce n'est pas très fonctionnel, et Standard ML est certainement un langage fonctionnel.

Questions connexes