Если брать, что называется, перевод «в лоб», то выглядеть он будет не очень красиво, наверное (особенно, в моем исполнении, так как сразу скажу, что я не знаток Хаскеля — просто интересующийся =)
Попробовал накидать что-то в первом приближении (это просто сырой набросок, который нужно дорабатывать до рабочего варианта при необходимости). Получилось нечто такое:
N =
start =
k =
defect0 =
calcDefectTemp defectStart i =
let getInnerPairs steps N = [(i, j) | i <- [1..steps], j <- [0..N]] in
let f acc (n, j) = acc - (P_tau_LH !! (n*(N+1)*..... )) in
foldl f defectStart (getInnerPairs steps N)
calcDefectN defectTemps = maximum (0 : defectTemps)
main = do
let lst = map (\i -> (i, calcDefectTemp 1.0 i)) [N-k+1..N]
mapM (\(idx, def) -> print $ show idx ++ " " ++ show def) lst
let defectN = calcDefectN $ map (\(idx, def) -> def) lst
print $ "defect of P_tau_LH=" ++ (show $ maximum [defect0, defectN]) ++ ...
return ()
Вообще, насколько я понимаю, для функциональных языков часто нужно отталкиваться от входных условий для формирования правильного алгоритма решения задачи, так как «буквальная реализация» императивного кода дает не лучшие результаты (мягко говоря =).