IO Monad是否懒洋洋地评估?

时间:2013-01-23 21:02:56

标签: haskell

以下是我尝试找到一些素数除数的代码。我试图将TAOCP算法转换为Haskell程序,但我可以理解某些内容是懒惰还是急切地评估:

modof2 n = let a0 = shiftR n 1
           a1 = shiftL a0 1
       in n-a1
iseven n = modof2 n == 0

factoringby2 n = let s=(lastf (takeWhile f [1..])) + 1
                 d=n `quot` powerof2 s
             in (s,d)
  where f s = let d = n `quot` (powerof2 s)
            in if isodd d 
               then False
               else True
      lastf [] = 0
      lastf xs = last xs

miller_rabin_prime_test n 0 result=return result
miller_rabin_prime_test n k result| (isodd n) && n>3 = do
                                            a<-randomRIO(2,n-2)
                                            let z = basic_step n a (fst sd) (snd sd)
                                            miller_rabin_prime_test n (k-1) z
  where sd=factoringby2 n
basic_step:: Integer->Integer->Int->Integer->Bool
basic_step n a s d =any (\x-> x==1 || x==n-1) (map x (map u [0..s-1]))
  where u j=powerof2(j)*d 
        x j=modular_pow a j n 1

isprime n = if n==2 || n==3
        then return True
        else if n<2
             then return False
             else if iseven n
                  then return False
                  else miller_rabin_prime_test n 5 True
x_m :: Double->Integer->Integer
x_m 0 n = 2
x_m m n = f (x_m (m-1) n) `mod` n
where f x = x^2 +1
l::Double->Double
l m = 2 ^ (floor (log2 m))
where log2 m = log m / log 2
g m n = let a = x_m m n
        b = x_m ((l m)-1) n
     in gcd (a-b) n

gg n = [g m n|m<-[1..]]


algorithmB n = do
            testprime<-isprime n
            let a = head (filter (1>) (gg n))
            c<-algorithmB (n `div` a)
            if testprime
            then return []
            else return (a:c)

algorithmB不会终止。为什么会这样?我认为c<-algorithmB (n div a)是原因,因为它不会懒惰地评价。真的吗? 感谢

1 个答案:

答案 0 :(得分:1)

algorithmB在无限循环中调用自身。当然它不会回来!