我想实现一个多态的快速排序。我想指出
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)

最佳答案

您可以通过在顶级类型签名中启用ScopedTypeVariablessupplying an explicit forall来解决下一个错误:

quicksort :: forall a. IArray UArray a => [a] -> [a]


然后,您会发现您的STUArray不是MArray的实例,因为任意a都有no instance。如果将其设置为Int,它将进行编译。

当然,明显没有此类实例的原因是,未装箱的数组只能包含不可装箱的值,该值是原始类型的值,您可以在the relevant documentation中对其进行详尽列出。

10-08 13:01