开发者

Standard ML: how to execute another function within a function?

开发者 https://www.devze.com 2022-12-15 10:18 出处:网络
Currently, my code looks like this: fun gradImage () = let val iImg = Gdimage.image(640,480) (0,0,0); val void = mapi gradient iImg;

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号