可折叠的IntSet

时间:2017-07-31 20:44:45

标签: haskell set foldable

对我来说,整数集似乎是一个可折叠的数据结构。 为什么Data.IntSet不是Foldable的实例?

我的目的是在find上使用IntSet。 如何实现Data.IntSet的查找?

1 个答案:

答案 0 :(得分:6)

IntSet不能来自Foldablebase,因为它没有* -> *种类。

ghci> :t foldr
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
ghci> :k Foldable
Foldable :: (* -> *) -> Constraint
ghci> import Data.IntSet (IntSet)
ghci> :k IntSet
IntSet :: *

简单来说,要成为Foldable base的实例,您的数据类型应该由某个类型变量进行参数化。如果你想在IntSet上使用某些操作,你应该使用Data.IntSet模块中的一些函数来实现所有专用版本。

但我想补充一点,Foldable存在IntSet{-# LANGUAGE TypeFamilies #-} type family Element t type instance Element (f a) = a type instance Element Text = Char type instance Element IntSet = Int class ProperFoldable t where foldr :: (Element t -> b -> b) -> b -> t -> b 可以实例化(we actually did this in our library,这是MonoFoldable之前完成的。您只需要正确实现抽象:

find

更新(按要求添加find :: (a -> Bool) -> IntSet -> Maybe a):

由于a类型变量,您无法实施a。你能回答问题«什么是IntSet?»? Int不是多态容器。它仅包含find :: (Int -> Bool) -> IntSet -> Maybe Int个。因此,您可以实现的最大值是IntSet。并且没有有效的方法来实现此功能,只需将import Data.Foldable (find) import Data.IntSet (IntSet) import qualified Data.IntSet as IS intSetFind :: (Int -> Bool) -> IntSet -> Maybe Int intSetFind predicate = find predicate . IS.elems 转换为如下列表:

return HttpResponseRedirect(reverse('editFamily', kwargs={'pk': family_id}))