为什么Data.Sequence没有`insert'或`insertBy',我该如何有效地实现它们呢?

dan*_*raj 5 containers haskell

由于Data.List提供了这些函数,我对Sequence类型的接口中缺少这些函数感到困惑.这里是否存在效率问题,或者仅仅缺乏对这些功能的需求?

由于它们不属于Data.Sequence,我如何才能有效地实现它们?

Mik*_*kov 4

这是我想出的:

> let insertBy cmp x seq = let (s1,s2) = partition (\y -> cmp x y == GT) seq in (s1 |> x) >< s2
> let s = fromList [1,2,3,4,5]
> insertBy compare 2 s
fromList [1,2,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

或者你可以模仿列表的版本:

{-# LANGUAGE ViewPatterns #-}

module Main
    where

import Data.Sequence

insertBy :: (a -> a -> Ordering) -> a -> Seq a -> Seq a
insertBy _   x (viewl -> EmptyL) = singleton x
insertBy cmp x ys@(viewl -> (y:<ys'))
 = case cmp x y of
     GT -> y <| insertBy cmp x ys'
     _  -> x <| ys
Run Code Online (Sandbox Code Playgroud)

  • 我想这基本上和最快的方法一样快。我将把这个答案标记为正确,因为我刚刚意识到我需要的不仅仅是序列,我需要强制序列始终有序的不变量,这样我就可以在 O(log n) 时间内而不是 O( n) 时间。 (3认同)