Question

Currently, my code looks like this:

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 is a function with type intint->intint*int->image->unit. Essentially it operates on the image supplied.

The function looks ugly with val void = ...

How could I eliminate that?

Was it helpful?

Solution

You can have a list of expressions between in and end in a let expression. So you could rewrite your code to

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

I assume mapi modifies iImg in place, as the code seems to be written that way. That doesn't sound very functional; it would feel more natural to have mapi return the modified image, but from what I can see of the Gdimage interface, it looks like how it's done there, and I understand it's probably better from efficiency perspective.

OTHER TIPS

It's been a decade since I've used SML, but I believe what you're looking for is this:

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

I actually prefer the additional type-checking offered by

val () = mapi gradient iImg

If this looks ugly, it should—it's not very functional, and Standard ML is definitely a functional language.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top