2

Data.Vector を使用しており、現在、暗号化ハッシュ (Sha1) の計算に使用するベクトルの内容を計算する必要があります。以下のコードを作成しました。

dynamic :: a -> Int -> (Int -> Vector a -> a) -> Vector a
dynamic e n f = 
let 
    start = Data.Vector.replicate n e   
in step start 0
where
    step vector i = if i==n then vector
                    else step (vector // [(i,f i vector)]) (i+1)

これを作成したのは、ベクトルを埋める関数 f が途中で部分的な結果にアクセスできるようにするためです。確かに、このようなものが Data.Vector に既に存在しているはずですよね?

問題文は次のとおりです。完成した結果が配列になる動的計画法の問題を解こうとしています。配列サイズのサイズを知っており、それを埋めるための再帰関数があります。

4

2 に答える 2

8

あなたはすでに関数を見たことがあるでしょう。これはサイズと型の関数generateを取り、サイズの関数を生成します。おそらく気付いていなかったのは、この関数を使用すると、実際には部分的な結果にアクセスできるということです。nfInt -> aVector an

私が言いたいのは、渡す関数内で、generate定義しているベクトルを参照でき、Haskell の遅延により正常に動作するということです (ベクトルのさまざまな項目が相互に依存するように作成しない限り)。もちろん、円形の方法です)。

例:

import Data.Vector

tenFibs = generate 10 fib
    where fib 0 = 0
          fib 1 = 1
          fib n = tenFibs ! (n-1) + tenFibs ! (n-2)

tenFibsは、最初の 10 個のフィボナッチ数を含むベクトルになりました。

于 2010-09-08T22:34:03.213 に答える
0

たぶん、Data.Vector のスキャン関数の 1 つを使用できますか? http://hackage.haskell.org/packages/archive/vector/0.6.0.2/doc/html/Data-Vector.html#32

于 2010-09-07T14:00:22.870 に答える