相关疑难解决方法(0)

为什么极简主义,例如Haskell quicksort不是一个"真正的"快速排序?

Haskell的网站介绍了一个非常有吸引力的5行快速排序功能,如下所示.

quicksort [] = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
    where
        lesser = filter (< p) xs
        greater = filter (>= p) xs
Run Code Online (Sandbox Code Playgroud)

它们还包括"C中的真正快速排序".

// To sort array a[] of size n: qsort(a,0,n-1)

void qsort(int a[], int lo, int hi) 
{
  int h, l, p, t;

  if (lo < hi) {
    l = lo;
    h = hi;
    p = a[hi];

    do {
      while ((l < h) && (a[l] <= p)) 
          l …
Run Code Online (Sandbox Code Playgroud)

sorting haskell quicksort

112
推荐指数
7
解决办法
4万
查看次数

如何改变STVector?

MVector有两种口味,IOVectorSTVector.我想编写一些使用的函数STVector,这样即使使用快速可变矢量算法也可以从纯代码中调用它们Data.Vector.Algorithms.

相关主题的帮助下,我已经Vector到了那里:我可以将一个不可变的东西粘在一个可变的ST上下文中:

import Control.Monad.ST
import Data.Vector
import Data.Vector.Algorithms.Intro (sort)

x = fromList [1,4,2] :: Vector Int

verboseCopy :: Vector Int
verboseCopy = runST $ do v <- thaw x
                         freeze v
Run Code Online (Sandbox Code Playgroud)

我只需要sort在解冻和冻结之间运行.

也许令人惊讶的是,我没有必要import Data.Vector.Mutable,这STVector是定义的地方.也许我应该使用类型签名来指定我想要thaw生成一个STVector,但我不知道如何:如果我将thaw行更改为:

v <- thaw x :: Data.Vector.Mutable.STVector s Int
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

• Couldn't match expected type ‘MVector
                                  (primitive-0.6.3.0:Control.Monad.Primitive.PrimState (ST s))
                                  Int’ …
Run Code Online (Sandbox Code Playgroud)

state haskell vector mutable

3
推荐指数
1
解决办法
178
查看次数

标签 统计

haskell ×2

mutable ×1

quicksort ×1

sorting ×1

state ×1

vector ×1