std.functional:partial - disambiguating templated functions

Laeeth Isharc via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Oct 4 12:12:50 PDT 2015


On Sunday, 4 October 2015 at 18:24:08 UTC, John Colvin wrote:
> On Sunday, 4 October 2015 at 18:08:55 UTC, Laeeth Isharc wrote:
>> On Sunday, 4 October 2015 at 17:17:14 UTC, Laeeth Isharc wrote:
>>> On Sunday, 4 October 2015 at 16:37:34 UTC, John Colvin wrote:
>>>> On Sunday, 4 October 2015 at 15:45:55 UTC, Laeeth Isharc 
>>>> wrote:
>>>>> How do I persuade partial to tie itself to the appropriate 
>>>>> overload?
>>> ---
>>>> As far as I can see std.functional.partial only does one 
>>>> argument at a time.
>>>>
>>>> bars=partial!(partial!(partial!(slurpBars!BarType, 
>>>> filename), startDate), endDate);
>>>>
>>>> or maybe, I'm not sure, but maybe you can do:
>>>>
>>>> bars=partial!(slurpBars!BarType, AliasSeq!(filename, 
>>>> startDate, endDate));
>>>>
>>>> If you find you really need to manually mess with overloads, 
>>>> use http://dlang.org/traits.html#getOverloads. You may have 
>>>> to wrap it in AliasSeq in some situations due to 
>>>> grammar/parser constraints.
>>> fwiw - still doesn't work (whether I use alias or auto, 
>>> trying each of your solutions).  I'll look at getOverloads.
>>
>> How do I distinguish between two overloads that return the 
>> same type but have different arguments?  It looks like 
>> getOverloads only deals with cases where the return type is 
>> different, judging by the docs.
>
> getOverloads should give you all the overloads of a function, 
> whether they return the same or different types.  The example 
> in the docs just happens to have different types.
>
> In general, return types are not considered when talking about 
> overloads. For example, two functions that take the same 
> arguments but have different return types are not overloaded, 
> they are in conflict.

Thanks for this.  The only problem then is how to manipulate what 
getOverloads returns.  (No need to do this now as it's not worth 
it - I just wanted to try using partial if it wasn't too much 
work.  easier just to make an alternate declaration with the type 
in its name).

Is this not a bug in the implementation of partial?

import std.functional;
import std.stdio;

void bish(T)(string arg, string barg)
{
	writefln("bishs: %s, %s",arg,barg,to!T);
}
void bish(T)(int argi, string barg)
{
	writefln("bishi: %s, %s",argi,barg.to!T);
}

void main(string[] args)
{
	alias b=partial!(bish!string,"hello"); // this line does not 
compile
	alias c=partial!(b,"therex");
	b("there");
	c();
}

[laeeth at engine marketdata]$ dmd partial.d
partial.d(15): Error: template partial.bish matches more than one 
template declaration:
partial.d(4):     bish(T)(string arg, string barg)
and
partial.d(8):     bish(T)(int argi, string barg)


partial knows which overload to call - I told it!

it works fine without templated arguments.  so the following 
works fine:

import std.functional;
import std.stdio;

void bish(string arg, string barg)
{
	writefln("bishs: %s, %s",arg,barg);
}
void bish(int argi, string barg)
{
	writefln("bishi: %s, %s",argi,barg);
}

void main(string[] args)
{
	alias b=partial!(bish,"hello");
	alias c=partial!(b,"therex");
	b("there");
	c();
}




More information about the Digitalmars-d-learn mailing list