Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 数据。对于无序容器可折叠_Haskell_Typeclass_Parametric Polymorphism - Fatal编程技术网

Haskell 数据。对于无序容器可折叠

Haskell 数据。对于无序容器可折叠,haskell,typeclass,parametric-polymorphism,Haskell,Typeclass,Parametric Polymorphism,我正在开发一种用于数据库操作的Haskell meets SQL语言,以及一个与之配套的通用类型类库,在任何有意义的地方抄袭黑客技术 因为数据库查询优化器的一个重要目标是消除不必要的排序,所以保留实际上需要排序的位置的静态表示非常重要。这让我们来定义折叠的typeclass Haskell的Data.Foldable有:(省略了与我的观点无关的默认定义) 在我看来,这个类忽略了一个区别,实际上,这个区别对大多数Haskell应用程序来说并不重要,但对数据库设置更感兴趣。也就是说:所有数据。可折叠

我正在开发一种用于数据库操作的Haskell meets SQL语言,以及一个与之配套的通用类型类库,在任何有意义的地方抄袭黑客技术

因为数据库查询优化器的一个重要目标是消除不必要的排序,所以保留实际上需要排序的位置的静态表示非常重要。这让我们来定义折叠的typeclass

Haskell的
Data.Foldable
有:(省略了与我的观点无关的默认定义)

在我看来,这个类忽略了一个区别,实际上,这个区别对大多数Haskell应用程序来说并不重要,但对数据库设置更感兴趣。也就是说:所有
数据。可折叠的
实例都有一个顺序

这个概念的泛化名称是什么,适用于不对元素进行排序的容器类型?

对于Haskell
Data.Set
s,它的效果很好,因为实现需要一个
Ord
上下文。然而,排序需求是一个实现工件,对于许多有用的类型,所使用的排序可能没有任何域级别的含义

对于更一般的集合,
fold::monoidm=>tm->m
定义本身基本上是正确的(因此
foldMap
)。我之所以这么说,主要是因为它的类型包括结合性定律(通过定义
幺半群
),而不是要求的交换性定律。其他变种甚至不存在

我不想在不需要它们的地方介绍它们。我也不想在无法追踪的地方引入非决定论。我感兴趣的是构建一个没有
toList::Set a->[a]
函数的语言和库,因为它引入了以下两者之间的二分法:

  • 允许人们观察有关集合/关系物理存储方式的实现细节
  • 失去了非决定论的影响
  • 显然,
    sortBy::(a->a->Ordering)->Set a->[a]
    shuffle::Set a->Data.Random.RVar[a]
    都是有用的、无异议的,并且将被包括在内。事实上,
    sortBy
    有一个更为通用的类型,如
    sortBy::(无序的折叠类名f)=>(a->a->Ordering)->fa->[a]


    这个想法叫什么?如果我离基很远,我把基路径留在哪里了?

    类折叠算子执行的操作不会在幺半群上操作,而是在交换半群上操作。这将为您提供
    op::(CSemi a)=>fa->a->a

    在我所看到的文献中,运算符/类型类的典型名称是CFold——交换折叠的缩写。(YAHT也使用cfold作为cps样式折叠的名称,但我认为这不是常见用法)

    class Foldable t where
      -- | Combine the elements of a structure using a monoid.
      fold :: Monoid m => t m -> m
    
      -- | Map each element of the structure to a monoid,
      -- and combine the results.
      foldMap :: Monoid m => (a -> m) -> t a -> m
    
      -- | Right-associative fold of a structure.
      foldr :: (a -> b -> b) -> b -> t a -> b
    
      -- | Left-associative fold of a structure.
      foldl :: (a -> b -> a) -> a -> t b -> a
    
      -- | A variant of 'foldr' that has no base case,
      -- and thus may only be applied to non-empty structures.
      foldr1 :: (a -> a -> a) -> t a -> a
    
      -- | A variant of 'foldl' that has no base case,
      -- and thus may only be applied to non-empty structures.
      foldl1 :: (a -> a -> a) -> t a -> a