Issue 8142 - std.functional.curry isn't flexible enough
Summary: std.functional.curry isn't flexible enough
Status: NEW
Alias: None
Product: D
Classification: Unclassified
Component: phobos (show other issues)
Version: D2
Hardware: All All
: P4 enhancement
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-05-24 14:40 UTC by bearophile_hugs
Modified: 2024-12-01 16:15 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description bearophile_hugs 2012-05-24 14:40:11 UTC
std.functional.curry doesn't work if the first argument (the curried one) is a function. This is a common enough use case:


import std.functional;
auto foo(T)(T function(T x) f, T x) {
    return f(x);
}
int bar(int x) { return x * 2; }
alias curry!(foo, &bar) fooBar;
void main() {}


DMD 2.060alpha gives:

temp.d(6): Error: expression & bar is not a valid template value argument
temp.d(6): Error: template instance std.functional.curry!(foo,& bar) error instantiating

I think D functional-style programming needs a more flexible/uniform currying.


Workaround:

import std.traits: ParameterTypeTuple;
auto foo(alias F)(ParameterTypeTuple!F[0] x) {
    return F(x);
}
int bar(int x) { return x * 2; }
alias foo!bar fooBar;
void main() {
    assert(fooBar(5) == 10);
}


But this is not as flexible. A language that supports functional programming needs to handle functions as first class citizens.
Comment 1 dlangBugzillaToGithub 2024-12-01 16:15:08 UTC
THIS ISSUE HAS BEEN MOVED TO GITHUB

https://github.com/dlang/phobos/issues/9926

DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB