Template currying

Yuxuan Shui via Digitalmars-d digitalmars-d at puremagic.com
Thu May 5 16:33:07 PDT 2016


On Thursday, 5 May 2016 at 23:19:59 UTC, Yuxuan Shui wrote:
> On Thursday, 5 May 2016 at 23:12:40 UTC, Ed wrote:
>> On Thursday, 5 May 2016 at 22:53:01 UTC, Yuxuan Shui wrote:
>>> On Thursday, 5 May 2016 at 21:54:29 UTC, Ed wrote:
>>>> On Thursday, 5 May 2016 at 20:17:08 UTC, Yuxuan Shui wrote:
>>>>> [...]
>>>>
>>>> It's hard to help without a minimal working example (maybe 
>>>> something with just the body).
>>>>
>>>> If you mean that "alias new_parser = Comb!(a, b);" generates 
>>>> an error maybe that's because the correct syntax is "alias 
>>>> new_parser(Range) = Comb!(a, b);" ?
>>>>
>>>> One issue you may encounter is that template parameter 
>>>> deduction (that's called IFTI I think) can fail with an 
>>>> alias (so partially specialized template/templatized 
>>>> function, etc).
>>>
>>> Simple example:
>>>
>>>     int a(int b, T)(T c){return 0;}
>>>
>>> It's fine to:
>>>
>>>     a!1(2);
>>>
>>> But:
>>>
>>>     alias A = a!1;
>>>
>>> Would fail.
>>
>> alias aa(T) = a!(1,T);
>> aa!ubyte(2);
>>
>> Your alias declaration is not correct.
>
> As you can see in my first post, I know how to make this work. 
> I just think it'd be nice if compiler can do this automatically.
>
> Anothor point is that, what if I want to use partially 
> instantiated templates as template arguments?

See this example:

     int a(alias f)(){return f(3);}
     int b(int z, T)(T c){return c;}
     void main() {
       a!(b!1)();
     }

It'd really nice if this just works, or if there's something 
called Curry which I can use like this:

     a!(Curry!(b, 1))


More information about the Digitalmars-d mailing list