haskell - 就地多态快速排序中的 STUArray 类型参数

标签 haskell

我想实现一个多态快速排序。我想具体说明一下 IArray UArray a => [a] -> [a] 中的 type a 和 ST (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 的实例,因为有 no instance对于任意a。如果将其设置为 Int,它将编译。

当然,明显缺乏此类实例的原因是,未装箱数组只能包含unboxeable值,该值是原始类型,一个详尽的名册,您可以在 the relevant documentation 中查看。 .

关于haskell - 就地多态快速排序中的 STUArray 类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48965848/

相关文章:

haskell - Haskell 中的类型问题

haskell - 在 Haskell 中访问自定义数据类型的成员

haskell - 占用列表的最后 n 个元素的最有效方法是什么

haskell - Haskell 如何在 MaybeT 实现中推断出正确的类型类?

haskell - http-conduit 浏览器使用

haskell - 在 Haskell 中导入 Prelude 中已经定义的东西的正确方法

haskell - 关于 Haskell 的参数化概念

haskell - Haskell 中的闭包是如何工作的?

haskell - 如何在haskell中处理SIGWINCH?

haskell - haskell中的函数组合类型推断