我想实现一个多态的快速排序。我想指出
在IArray UArray a => [a] -> [a]
中键入a和ST s (STUArray s Int a)
是相同类型。我怎样才能做到这一点 ?
{-# LANGUAGE FlexibleContexts #-}
module Quicksort where
import Control.Monad.ST (ST)
import Data.Array.ST (runSTUArray, newListArray, STUArray)
import Data.Array.IArray (elems)
import Data.Array.Unboxed (UArray, IArray)
quicksort :: IArray UArray a => [a] -> [a]
quicksort l = elems $ runSTUArray $
do newListArray (0, 9) l :: ST s (STUArray s Int a)
最佳答案
您可以通过在顶级类型签名中启用ScopedTypeVariables
和supplying an explicit forall
来解决下一个错误:
quicksort :: forall a. IArray UArray a => [a] -> [a]
然后,您会发现您的
STUArray
不是MArray
的实例,因为任意a
都有no instance。如果将其设置为Int
,它将进行编译。当然,明显没有此类实例的原因是,未装箱的数组只能包含不可装箱的值,该值是原始类型的值,您可以在the relevant documentation中对其进行详尽列出。