gpt4 book ai didi

haskell - 可以用未装箱的向量进行递归定义吗?

转载 作者:行者123 更新时间:2023-12-02 10:46:41 25 4
gpt4 key购买 nike

我想递归地生成一个未装箱的向量。举个简单的例子:

import qualified Data.Vector as V

fib :: V.Vector Int
fib = V.generate 10 f
where
f 0 = 0
f 1 = 1
f x = (fib V.! (x - 1)) + (fib V.! (x - 2))

该函数正确生成斐波那契数列。但是,如果我改用 Data.Vector.Unboxed,代码将挂起。我明白这是为什么,但我仍然希望能够进行递归定义并获得未装箱向量的速度。有这样做的可能性吗?

最佳答案

一种可能性是使用未装箱的可变向量,并在构建完成后卡住它:

import Control.Monad.ST (runST)
import Control.Monad (forM_, ap)
import qualified Data.Vector.Unboxed as U
import qualified Data.Vector.Unboxed.Mutable as M

fib :: Int -> U.Vector Int
fib s = runST $ M.new s >>= ap ((>>) . forM_ [0..s - 1] . f) U.unsafeFreeze
where
f v 0 = M.write v 0 0
f v 1 = M.write v 1 1
f v i = do
a <- M.read v (i - 1)
b <- M.read v (i - 2)
M.write v i (a + b)

关于haskell - 可以用未装箱的向量进行递归定义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38206377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com