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

标签 haskell recursion vector

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

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/

相关文章:

c++ - 从 int[] 转换为 list<int> : Any better way

haskell - 定义实例与使用类约束

haskell - bool 表达式和副作用

c++ - 在 C++ 中使用中序遍历对 BST 中的节点进行排序

cakephp - 在 CakePHP 中向 Containable 添加条件

c++ - 关于在包含许多子目录的项目上使用 make 的反馈

Haskell:嵌套列表理解

string - 如何将一个字符串拆分为长度全部为 3 的字符串列表?

r - 如何计算R中向量中有序的相同元素的数量?

c++ - std::vector 超出范围