1

我有一段来自Get Programming with Haskell 一书的代码片段,如下所示:

listToSTUArray :: [Int] -> ST s (STUArray s Int Int)
listToSTUArray vals = do
    let end =  length vals - 1
    myArray <- newArray (0,end) 0
    forM_ [0 .. end] $ \i -> do
      let val = vals !! i
      writeArray myArray i val
    return myArray

为了更好地理解ST s这里上下文中转换的完整过程,我决定将这些代码行扩展为使用>>, >>=and的表达式return。所以我的尝试导致了这段代码:

listToSTUArray vals = (\end -> (newArray (0,end) 0) (length vals - 1)) >>= 
                      (\myArray -> (forM_ [...] >> return myArray))

它是正确的扩展吗?用或类似的动作扩展do-notations的一般方法是什么,forM_因为它们进行了一些计算但在上下文中丢弃了结果?

4

0 回答 0