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)