对我来说,整数集似乎是一个可折叠的数据结构。
为什么是Data.IntSet
不是一个实例Foldable
?
我的实际意图是使用find
on an IntSet
。
我怎样才能实现查找Data.IntSet
?
IntSet
不可能Foldable
from 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
from base
您的数据类型应该由某种类型变量参数化。如果你想使用一些操作IntSet
你应该使用一些函数Data.IntSet
实现所有专用版本的模块。
但我想补充一点,存在版本Foldable
which IntSet
可以实例化(并且我们实际上是在我们的图书馆里这样做的 https://github.com/serokell/universum/blob/5ced025bfa522beba133d35e2093cd81dd21726e/src/Containers.hs#L172这是早些时候完成的MonoFoldable http://hackage.haskell.org/package/mono-traversable-1.0.2.1/docs/Data-MonoTraversable.html#t:MonoFoldable)。您只需要正确实现您的抽象:
{-# 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
UPDATE(添加find
按要求):
你无法实施find :: (a -> Bool) -> IntSet -> Maybe a
因为a
类型变量。你能回答问题“什么是a
?»? IntSet
不是多态容器。它仅包含Int
s。所以你可以实现的最大值是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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)