Edit: I think I get it now after re-reading the tutorial. * is the wildcard type and can resolve to any type since Stdout.line never fails. So its compatible with the I32 requirement.
Hi there. I have what I think is a basic type system question. I was reading through the basic-cli platform and saw that the platform requires a name main which main : Task {} I32
I'm confused why main = Stdout.line "hello" satisfies this constraint since its type isTask.Task {} *.
My understanding was that the * in the type annotation means "no value" while the platform seems to require an I32 on failure.
Hi @Hrishikesh Dharam,
I don't know how the type checking works in detail but I believe the following is happening; the * in Task {} * means that Stdout.line can not return an "error Task". With that type signature, the compiler knows line is guaranteed to return an empty success Task ({}) and because the success case ({}) matches the success case of Task {} I32 all is well :)
Thanks Anton, that mental model makes sense to me
Hrishikesh Dharam has marked this topic as resolved.
Last updated: Nov 09 2025 at 12:14 UTC