2009-10-07 6 views
0

Je l'extrait de code de code suivantgarde est ignorée quand il ne doit pas être

module Main where 

main :: IO() 
main = do 
    ne <- getLine 
    c <- getLine 
    putStrLn $ show $ foo c (words ne) 

foo :: String -> [String] -> Integer 
foo c (n:e:_) = 
    foo' (read c::Integer) (read e::Integer) (read n::Integer) [2..] 
    where foo' c e n (x:xs) 
     | mod (x^e) n == c = mod x n 
     | otherwise = foo' c e n xs 

qui fonctionne comme prévu, sauf si compte tenu de l'entrée suivante:

9 3 
2 

Le premier garde est ignorée et une boucle infinie est entrée. La façon dont je vois ceci est que foo' devrait d'abord être appelé avec 2 9 3 qui se traduirait par mod (2^9) 3 == 2 ce qui est vrai et devrait aboutir à la valeur mod 2 9 mais ce n'est pas le cas.

Je suis sûr que je manque quelque chose trivial ici, mais je ne peux pas le voir ...

Répondre

1

Vous avez e et n la ronde de façon erronée dans la définition de foo » (n vient avant et dans foo, mais c'est l'inverse dans foo '). Donc, vous ne passez pas 2 9 3, vous passez 2 3 9.

+0

Toujours quelque chose de trivial ... Merci! – ezpz

1

foo "2" ["9","3"] se traduira par foo' 2 3 9 [2..], pas foo' 2 9 3 [2..]. Vous avez mélangé vos arguments?

Questions connexes