Я бы сказал, что это немного похоже на Один и только один раз
В C / C ++ я нахожу себя пишущим код, такой как
configure_grid (grid, first_column, last_column, action) {
for (i = first_column; i <= last_column; ++i)
// ...
}
configure_grids (action) {
congifure_grid (alpha, first_alpha, last_alpha, action);
congifure_grid (beta, first_beta, last_beta, action);
}
Вместо написанияцикл for один раз для каждого из альфа и бета.Это аналогично карри в процедурном коде.Преимущество здесь очевидно.
Карринг является важной теоретической концепцией, но с точки зрения практических это преимущество.
На самом деле, я помню, как писал набор тестовв Си один раз это было примерно так:
typedef bool (*predicate) (const type *);
const char * argument;
bool do_foo (const type * t) {
return bar (t, argument);
}
bool do_baz (const type * t) {
return bap (t, argument);
}
predicate foo (const char * arg) {
argument = arg;
return do_foo;
}
predicate baz (const char * arg) {
argument = arg;
return do_baz;
}
assert (for_all (data_set("alpha"), foo ("abc")));
assert (for_all (data_set("beta"), baz ("def")));
Все это было на чистом C, без хитрости макросов и т. д. Функциональный стиль и что-то вроде карри.Здесь преимущество в том, что вы можете сразу увидеть, каковы тестовые случаи.data_set
похож - он связывает свой аргумент с другой функцией, которая извлекает данные: for_all
выполняет thunk, проверяет предикат и очищает.Tidy.