Arrays Haskell可变数组未修改

Arrays Haskell可变数组未修改,arrays,haskell,monads,Arrays,Haskell,Monads,我在解决问题,我在工作 我有一个可变的IOArray来存储我已经计算的Collatz长度: import Data.Array.IO import Control.Monad import Data.Array p14 :: IO [Int] p14 = do array <- p14extra forM_ [1..1000000] $ \i -> do e <- readArray array i if e == 0 then do

我在解决问题,我在工作

我有一个可变的
IOArray
来存储我已经计算的Collatz长度:

import Data.Array.IO
import Control.Monad
import Data.Array

p14 :: IO [Int]
p14 = do
  array <- p14extra
  forM_ [1..1000000] $ \i -> do
    e <- readArray array i
    if e == 0
      then do
        let col  = collatz i
        forM_ col $ \(v,i) -> do
          writeArray array i v
      else return ()
  frozen <- freeze array
  return $ elems frozen

-- an `IOArray` from `1` to `1000000` full of `0`
p14extra :: IO (IOArray Int Int)
p14extra = newArray (1,1000000) 0

collatz :: Int -> [(Int, Int)]
collatz n
  | n == 1    = [(1,1)]
  | otherwise = (n, (snd $ head hack) + 1) : hack
  where
    hack = collatz $ if even n then (n `div` 2) else (3 * n + 1)
导入Data.Array.IO
进口管制
导入数据。数组
p14::IO[Int]
p14=do
数组do
伊多
写入阵列i/v
否则返回()
冻结[(整数,整数)]
科拉茨
|n==1=[(1,1)]
|否则=(n,(snd$head hack)+1):hack
哪里
hack=collatz$如果偶数n那么(n`div`2)else(3*n+1)
其中,第一个元素是正在计算的数字,第二个数字是其Collatz序列的长度


问题是在
p14
中,我确实
写数组I v
,但它总是有一个0数组。为什么会这样?

我不知道你所说的“不被修改”是什么意思

使用此代码(请注意,我已经更改了迭代和数组边界):


我不知道你所说的“不被修改”是什么意思

使用此代码(请注意,我已经更改了迭代和数组边界):


我运行了您的精确代码,发现数组已更改

因为末尾有很多零,所以需要一直滚动到开头才能找到数字

事实上,如果你替换

  frozen <- freeze array
  return $ elems frozen

冻结我运行了您的精确代码,发现数组已更改

因为末尾有很多零,所以需要一直滚动到开头才能找到数字

事实上,如果你替换

  frozen <- freeze array
  return $ elems frozen

freezed这只是一个疯狂的预感,以防让您感到困惑:尽管
p14
修改了它使用的数组,但
p14extra
之后将不包含该数组。这是一个IO操作,每次运行它时都会创建一个新的填充有零的数组。

这只是一个胡思乱想的预感,以防这让您感到困惑:虽然
p14
修改了它使用的数组,但
p14extra
之后将不包含该数组。这是一个IO操作,每次运行时都会创建一个充满零的新数组。

请包含您的导入语句和函数的类型签名,这会让您认为数组没有被修改吗?你有没有试过在writeArray前后打印修改过的单元格内容?下面的投票是怎么回事?清楚地问,代码包括在内,很少的英语错误是所有。。。嗯,缺少导入…请包括您的导入语句和函数的类型签名。这会使您认为数组没有被修改吗?你有没有试过在writeArray前后打印修改过的单元格内容?下面的投票是怎么回事?清楚地问,代码包括在内,很少的英语错误是所有。。。嗯,进口商品不见了。。。
  frozen <- freeze array
  return $ elems frozen
  sol <- getElems array
  return (length . takeWhile (/=0) $ sol)