[2015-12-09] Challenge #244 [Easy]er - Array language (part 3) - J Forks
Forks
*fork 是一个接收三个函数作为参数的函数
给三个函数 f(y, x = defalut):
, g(y, x = default):
, h(y, x = default):
, 其中函数 g 是含有两个参数的真实的函数。
然后调用 Fork(f, g, h)
执行函数合成:
g(f(y, x), h(y, x)) (data1, data2)
1. 从字符串输入执行函数调用来产生字符串
sum divide count
(上面的输入是 Fork 函数的三个函数名)
2. 根据你喜欢的原生语言, 从上面的字符串输入中创建一个执行函数
3. 或创建一个接收三个函数作为输入的函数并返回一个函数
Fork(sum, divide, count) (array data)
应该返回数组的平均数。
4. 扩展上面的函数使函数参数接收基数
对于 5 个参数, Fork(a, b, c, d, e) 是:
b(a, Fork(c,d,e)) NB. should expand this if producing strings.
smls 给出的答案:
use v6;
sub sum ($y, $x = 0) { $y.sum + $x }
sub count ($y, $x = 0) { $y.elems + $x }
sub divide ($y, $x = 1) { $y / $x }
multi Fork (&f, &g, &h) {
sub (|args) { g f(|args), h(|args) }
}
multi Fork (&f, &g, *@rest where * !%% 2) {
sub (|args) { g f(|args), Fork(|@rest)(|args) }
}
say Fork(&sum, ÷, &count)([1, 2, 3, 4, 5]); # 3
say Fork(&sum, ÷, &sum, ÷, &count)([1, 2, 3, 4, 5]); # 5
网友评论