以下是Monad中ST
Monads中选择排序的实现。输入数组被复制到STUArray s Int Int
与thaw
,然后复制就地排序。我如何概括这个就地选择排序?
selectionSort :: UArray Int Int -> UArray Int Int
selectionSort arr = runSTUArray $ do
let (l, n) = bounds arr
a <- thaw arr
forM_ [l..n] $ \i -> do
minIdx <- newSTRef i
forM_ [i..n] $ \j -> do
currentMin <- readSTRef minIdx
jVal <- readArray a j
minVal <- readArray a currentMin
when (jVal < minVal) (writeSTRef minIdx j)
currentMin <- readSTRef minIdx
iVal <- readArray a i
minVal <- readArray a currentMin
writeArray a i minVal
writeArray a currentMin iVal
return a
使用FlexibleContexts
,我想概括类型:
(IArray UArray a, Ord a, Ix i, Enum i) => UArray i a -> UArray i a
然而,这将导致以下类型的错误:
Could not deduce (MArray (STUArray s) a (ST s))
arising from a use of `thaw'
from the context (IArray UArray a, Ord a, Ix i, Enum i)
如何更改的selectionSort
约束允许这种泛化?
如果你只是添加它说缺少的约束? – dfeuer
's'的类型不明确 –