develooper Front page | perl.perl6.users | Postings from July 2020

Re: cannot create an instance of subset type

Thread Previous
From:
Marcel Timmerman
Date:
July 11, 2020 09:07
Subject:
Re: cannot create an instance of subset type
Message ID:
848353b7-4abc-56e7-3f37-6bff110e4d7c@gmail.com
On 2020-07-10 23:37, Brad Gilbert wrote:
> Subset types are not object types.
>
> A subset is basically a bit of checking code and base type associated 
> with a new type name.
>
> In something like:
>
>     my ABC $a .= new;
>
> That is exactly the same as:
>
>     my ABC $a = ABC.new;
>
> Well there is no functional `.new` method on any subset types, so 
> `DEF.new()` isn't going to do anything.
>
>     DEF.new # ERROR
>
> ---
>
> The worst part of your code is that you are using a `subset` without a 
> `where` clause. Which is almost completely pointless.
>
> I honestly think that there is an argument to be made that it 
> shouldn't even be possible to write a `subset` without a `where` clause.
>
> It isn't like other languages where you can create something like a 
> lightweight clone or lightweight subclass of a type.
> It also isn't an alias.
>
> It's whole purpose is to attach a `where` clause as an extra check to 
> type based things.
>
>
>
> If you want an alias, use an alias
>
>     my constant DEF = ABC;
>
>     my constant DEF = ABC:D;
>
> If you want a lightweight subclass, create a lightweight subclass.
>
>     my class DEF is ABC {}
>
> If you want an extra check, then and only then does it make sense to 
> use a `subset`.
>
>     my subset GHI of Int where -10 ≤ $_ ≤ 10;
>
> ---
>
> A `subset` without a `where` clause only makes certain 
> language features become unavailable.
> Unless that is exactly what you want to accomplish, use something else.

Thanks very much Brad, for your answer. I understand completely. It was 
needed to mimic a C typedef which created a new type name from another. 
The example 'my constant DEF = ABC;' above would just do fine. I didn't 
thought about 'my class DEF is ABC {}' though, which also would work but 
creates more code I presume.

What I understand also now is that a subset is used on places where 
variables are assigned or bound like in argument lists and never created 
anew. Then, like you said, the where clause is always useful, if not 
obligatory, otherwise one could use the original type.

Regards,
Marcel
>
> On Fri, Jul 10, 2020 at 3:18 PM Marcel Timmerman <mt1957@gmail.com 
> <mailto:mt1957@gmail.com>> wrote:
>
>     Hi,
>
>     Using the next code I get an error on the instantiation of $d2;
>
>     ---
>     use v6;
>
>     class ABC {
>        method s ( Int $i ) { say $i + 10; }
>     }
>
>     subset DEF of ABC;
>
>     my ABC $a .= new;
>     $a.s(10);   # 20
>
>     my DEF $d1 = $a;
>     $d1.s(11);  # 21
>
>     my DEF $d2 .= new;
>     $d2.s(12);
>     ---
>
>     Error is
>
>     You cannot create an instance of this type (DEF)
>        in block <unit> at xt/subset-test.pl6 line 15
>
>     Why is this?
>
>     Regards,
>     Marcel
>


Thread Previous


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About