Хочу сравнить фрагмент кода на C и Haskell

Знатоки Haskell, покажите мне как следующий код, написанный на С, будет выглядеть на Haskell?

defect_N=0;

for(i=N-k+1; i<=N; i++) {
  defect_tmp=1;
 
  for(n=1; n<=steps; n++) 
    for(j=0; j<=N; j++) 
      defect_tmp-=P_tau_LH[n*(N+1)*(N+1)+i*(N+1)+j];
  
  if(defect_tmp>defect_N)
    defect_N=defect_tmp;
  
  printf("%d %lf\n",i,defect_tmp);
}

printf("defect of P_tau_LH=%lf=%e         defect_0=%lf, defect_N=%lf\n", max_double (defect_0,defect_N), max_double (defect_0,defect_N), defect_0, defect_N);
  • Вопрос задан
  • 4574 просмотра
Пригласить эксперта
Ответы на вопрос 2
shedward
@shedward
Ну вообще лучше бы вы формулы предоставили а не программу на С, но если я правильно понял метод расчета то это будет похожее на:

module Main where

import Text.Printf

idef i nn steps = 
	1 - sum [ n*(n+1)**2 + i*(n+1) + j | j <- [0..nn], n <- [0..steps]]

calcAndPrint i nn steps = do
	let res = idef i nn steps
	printf "%d %f" i res
	return res

defect k nn steps = 
	maximum [ calcAndPrint i nn steps | i <- [nn- k+1 .. nn]]

main = do
	let defect_0 = ...
	let defect_N = defect <k> <nn> <steps>
	printf "defect of P_tau_LH=%f=%e\n" defect_0


На хаскеле я писал довольно мало, поэтому может быть есть более лучший способ.
Ответ написан
tvolf
@tvolf
Если брать, что называется, перевод «в лоб», то выглядеть он будет не очень красиво, наверное (особенно, в моем исполнении, так как сразу скажу, что я не знаток Хаскеля — просто интересующийся =)
Попробовал накидать что-то в первом приближении (это просто сырой набросок, который нужно дорабатывать до рабочего варианта при необходимости). Получилось нечто такое:

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 ()


Вообще, насколько я понимаю, для функциональных языков часто нужно отталкиваться от входных условий для формирования правильного алгоритма решения задачи, так как «буквальная реализация» императивного кода дает не лучшие результаты (мягко говоря =).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы