我正在将David Blei的潜在Dirichlet分配的原始C实现移植到Haskell,我正在尝试决定是否在C中留下一些低级别的东西.以下函数是一个例子 - 它是一个近似值的二阶导数lgamma:
double trigamma(double x)
{
double p;
int i;
x=x+6;
p=1/(x*x);
p=(((((0.075757575757576*p-0.033333333333333)*p+0.0238095238095238)
*p-0.033333333333333)*p+0.166666666666667)*p+1)/x+0.5*p;
for (i=0; i<6 ;i++)
{
x=x-1;
p=1/(x*x)+p;
}
return(p);
}
Run Code Online (Sandbox Code Playgroud)
我把它翻译成或多或少惯用的Haskell如下:
trigamma :: Double -> Double
trigamma x = snd $ last $ take 7 $ iterate next (x' - 1, p')
where
x' = x + 6
p = 1 / x' ^ 2
p' = p / 2 + c / x'
c = foldr1 (\a b -> …Run Code Online (Sandbox Code Playgroud)