对我来说,整数集似乎是一个可折叠的数据结构。
为什么Data.IntSet
不是Foldable
的实例?
我的目的是在find
上使用IntSet
。
如何实现Data.IntSet
的查找?
答案 0 :(得分:6)
IntSet
不能来自Foldable
个base
,因为它没有* -> *
种类。
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}))