私は再帰関数を作成しようとしていますが、簡単にするためにリストとリストを作成してビルドしています。配列の作成と読み込みの両方を行う必要があるので、私は可変配列を使用しているので、一定の時間の読み書きができます。だから、署名と機能次のように次のようになります。複数の配列とリストを返す再帰関数
f :: [a] -> ST s ([a], STArray s Int a) -> ST s ([a], STArray s Int a)
f (x:xs) curr_arr =
case blah of
... -> f xs new_arr
f [] curr_arr = curr_arr
私は次のシグネチャを持つ関数h
をしたい:
h :: Int -> Int -> a -> [a] -> (Array Int a, [a])
そして、私はそれが大体次の実装を持つようにしたい:
h lbound ubound default_a xs = g (f xs (newArray lbound ubound default_a))
問題は、このシグネチャを持つg
関数が必要です。
ST s ([a], STArray s Int a) -> (Array Int a, [a])
しかし、私はこれを達成するためにrunST
とrunSTArray
を一緒にハックするように見えることはできません。
とにかくg
を実装する必要がありますか、最初にf
の署名を完全に違うものにする必要がありますか?