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 fu开发者_运维知识库nction 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?
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.
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.
精彩评论