我正在尝试构建一个递归函数,为简单起见,假设它需要一个列表并构建一个数组和一个列表。因为我需要在构建数组时读取和写入数组,所以我使用了一个可变数组,所以我可以进行恒定时间的读取和写入。所以签名和函数如下所示:
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
首先制作完全不同的签名?