D故障中的函数式编程

时间:2011-07-23 21:57:19

标签: templates types functional-programming d

我在D中创建模板时遇到问题:

pure T BSpline(int k:1, T)(in T x, in T[] t)
{
    if (t[0] <= x && x < t[k])
        return 1;
    else
        return 0;
}

pure T BSpline(int k, T)(in T x, in T[] t)
{
    if (t[0] <= x && x < t[k])
    {
        T a = (x - t[0]) / (t[k-1] - t[0]);
        T b = (t[k] - x) / (t[k] - t[1]);

        return a * BSpline!(k-1,T)(x, t[0..k-1]) + b * BSpline!(k-1,T)(x, t[1..k]);
    }
    else
        return 0;
}

然后我的单元测试:

unittest {
    real a = .5;
    real[] b = [0,0,1,2,3];
    assert(BSpline!(1,real)(a,b[0..2]) == 0);
    assert(BSpline!(2,real)(a,b[0..3]) == .5);
    assert(BSpline!(3,real)(a,b[0..4]) == .625);
    assert(BSpline!(4,real)(a,b[0..5]) == 0.260417);
}

失败并出现以下错误:

bspline.d(18): Error: template BSplineBasis.BSpline(int k : 1,T) does not match any function template declaration
bspline.d(18): Error: template BSplineBasis.BSpline(int k : 1,T) cannot deduce template function from argument types !(1,real)(const(real),const(real[]))
bspline.d(18): Error: template instance errors instantiating template

我不会问,但是,我不明白为什么D在从相当明确的参数类型中推断出模板函数时遇到了麻烦......

我做错了什么。

如果这应该是代码审查堆栈交换而不是在这里,请告诉我,但我希望这是我对模板如何工作而不是错误的误解。

1 个答案:

答案 0 :(得分:4)

我现在无法测试它,但我认为这是因为in T[] scope const T[]scope const(T[]),这对于每个人来说都要比{{scope const(T)[]更烦人。 1}},同时,几乎没有任何好处。

尝试更改

in T x, in T[] t

scope T x, scope const(T)[] t

在参数列表中,看看是否能解决问题。