in reply to Re^4: Moose type question
in thread Moose type question

I have no idea what that means.

Algebraic Data types are mostly from functional languages. In spirit they are similar to C unions, but in practice they are very different. They are also type-safe meaning they fit into the theoretical end of the type system whereas in C the "type" is really more a way of telling the compiler how much space to allocate. If you have ever played with Haskell or OCaml you have likely encountered them, but they are most definitely not the same thing as a union (C style or Moose style).

Filed as CPAN RT#58411

Yes, thank you very much, we have been discussing the best way to solve this.

The problem has nothing to do with undef.

You are correct, it is the Semi-Predicate problem, which we clearly stepped into with this implementation.

Undef is only a problem if you think it's ok for you and only you to use undef despite a long and continuing history of usefully using undef in Perl.

Right, thats my problem though. That long and continuing history of use is inconsistent and at times contradictory. Just think of all the possible permutations of return;,  return undef; and  return (); and what each of them means in scalar and list context. Now there be dragons.

-stvn

Replies are listed 'Best First'.
Re^6: Moose type question
by ikegami (Patriarch) on Jun 15, 2010 at 18:00 UTC

    we have been discussing the best way to solve this.

    An empty list cannot be placed in a scalar, so you could use an empty list.

    sub f { my $coercion_occurred = 1; # ... my $coerced_value = undef; # ... if ($coercion_occurred) { return $coerced_value; } else { return (); } } my $coercion_occurred = ($coerced_value) = f();