Функциональное программирование в беде - PullRequest
2 голосов
/ 24 июля 2011

У меня проблемы с созданием шаблона в 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 Ответ

4 голосов
/ 24 июля 2011

Я не могу проверить это прямо сейчас, но я думаю, что это потому, что in T[] - это scope const T[], то есть scope const(T[]), что намного раздражает всех, кто имеет дело с scope const(T)[], и в то же время время, в значительной степени не имеет никаких преимуществ.

Попробуйте изменить

in T x, in T[] t

до

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

в списке параметров, чтобы увидеть, решит ли это проблему.

...