私はHaskellでSmith-Watermanアルゴリズムを実装していますが、私はランタイムエラーになっている:私の実装では<<loop>>
ハスケル配列があまりにも厳しいですか?
は、私はHaskellのの怠惰な性質を利用しようとしているので、私は保存するために不変配列resarray
を使用します怠惰な再帰的スタブは、配列自体も参照している(依存関係のチェーンでresarray
は、resarray
に依存するcell
に依存するcellDef
に依存するzippedList
に依存する)。各セルはインデックスの少ないセルを参照するので、計算は実行可能でなければなりません...しかし、それはそのように動作しません。コンセプトの証明として
、私はGHCiの中で次のことを試してみました:
let arr = listArray (0,3) [0, arr ! 0, arr ! 1, arr ! 2 ]
、それが働きました。しかし、私の長い計算は、何らかの未知の理由で厳しくなってしまいます。ここで
は(、一緒にテストスクリプトとの完全なバージョン、hereである)私のコードです:
buildSWArray::
WordSequence ->
WordSequence ->
SWMatrix
buildSWArray ws1 ws2 = let
rows = arrLen ws1
cols = arrLen ws2
im = matToLinearIndex rows cols
mi = linToMatIndex rows cols
totsize = rows * cols
ixarr = [0 .. (totsize-1)]
cell i j
| i < 0 || j < 0 = 0
cell i j =
resarr ! (im i j)
cellDef k | k == 0 = (None,0)
cellDef k =
let
(i,j) = mi k
upwards = cell (i-1) j
leftwards = cell i (j-1)
diag = cell (i-1) (j-1)
-- One up if match, -5 if not match
c = if ws1 ! i == ws2 ! j then 1 else (-5)
hi = maximum [ 0, diag + c, upwards - 3, leftwards - 3]
in
-- Dirty way of guessing which one was picked up
case hi of
hi | hi == 0 -> (None, 0)
hi | hi == upwards - 3 -> (Upwards, hi)
hi | hi == leftwards - 3 -> (Leftwards, hi)
hi | hi == diag + c -> (Diag, hi)
zippedList = [ cellDef k | k <- ixarr ]
resarr = IA.listArray (0,(totsize - 1)) [ score | (way,score) <- zippedList ]
wayarr = IA.listArray (0,(totsize - 1)) [ way | (way,score) <- zippedList ]
in
SWMatrix rows cols wayarr resarr
私はそれを解決することができますか?
私の推測では、結び目を適切に結びつけることができませんでした。ベースケースを確認し、再帰的引数が減少しているという前提を確認します。 – cdk