1 votes

Prelude.!! : index trop grand (récursion Haskell basée sur l'accès à des éléments de liste calculés précédemment).

J'ai un tel code en Haskell. Il remplit la liste de manière récursive. Certains paramètres "i" (tous les pairs sauf 0) sont calculés en fonction des calculs précédents.

fillIn :: Int -> Int -> [Int] -> [Int]
fillIn max_val i list
  | i > max_val = list
  | i == 0 = ((function i):[]) ++ (fillIn max_val (i+1) list)
  | even i = (((list!!(i `div` 2)) + (i `div` 2)):[]) ++ (fillIn max_val (i+1) list)
  | otherwise = ((function i):[]) ++ (fillIn max_val (i+1) list)

Il génère une erreur : Prelude.!! : index trop grand lorsqu'il essaie d'accéder à la liste à 1 ( liste !!1 ). Je ne sais pas pourquoi car lorsqu'il calcule fillIn max_val 2 list il a fillIn max_val 1 list fait. Savez-vous comment je peux le réparer ? Merci d'avance.

1voto

Ignat Insarov Points 1812

J'ai pris la liberté de réécrire votre code dans une forme plus "conventionnel" la mode, (avec espoir) sans sans en changer le sens.

fillIn :: Int -> Int -> [Int] -> [Int]
fillIn max_val i list
    | i > max_val = list
    | i == 0 || odd i = f i: fillIn max_val (i + 1) list
    | even i = list !! (i `div` 2) + (i `div` 2): fillIn max_val (i + 1) list

On a toujours l'impression que vous avez pris un algorithme impératif sur les tableaux et que vous l'avez transposé en Haskell. il est difficile de comprendre ce que le code est censé faire. Mais j'ai fait une longue supposition que peut-être que vous vouliez dire list pour être un "accumulateur" et pour que la fonction soit récursive à la queue. Je peux alors le réécrire comme ceci :

fillIn :: Int -> Int -> [Int] -> [Int]
fillIn max_val i list
    | i > max_val = list
    | i == 0 || odd i = fillIn max_val (i + 1) (f i                              : list)
    | even i          = fillIn max_val (i + 1) (list !! (i `div` 2) + (i `div` 2): list)

- Et ça va vraiment marcher.

Je ne suis toujours pas sûr de ce qu'il calcule. Une sorte de séquence récursive. Si vous me dites quel est votre objectif est, peut-être nous pouvons concevoir un plus "idiomatique" version.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X