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