Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

std.functional.curry isn't flexible enough #9926

Open
dlangBugzillaToGithub opened this issue May 24, 2012 · 0 comments
Open

std.functional.curry isn't flexible enough #9926

dlangBugzillaToGithub opened this issue May 24, 2012 · 0 comments

Comments

@dlangBugzillaToGithub
Copy link

bearophile_hugs reported this on 2012-05-24T14:40:11Z

Transfered from https://issues.dlang.org/show_bug.cgi?id=8142

Description

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.
@LightBender LightBender removed the P4 label Dec 6, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants