BIFunctor有一个带有此签名的映射函数:
bimap :: (a -> b) -> (c -> d) -> p a c -> p b d
你也可以有这样一张地图:
othermap :: ((a, c) -> (b, d)) -> p a c -> p b d
具有此函数的类型是双函数函数的严格子集(您总是可以使用ourmap
定义bimap
,但反之亦然)。第二个签名有名字吗?
跟进:这个中间功能怎么样?
halfothermap :: ((a, c) -> b) -> (c -> d) -> p a c -> p b d
(扩展@glennsl的评论…)
类型pac
“包含a
和c
。
但是类型为(a,c)的函数-
othermap @Either :: ((a, c) -> (b, d)) -> Either a c -> Either b d
othermap f (Left x) = ?
othermap f (Right y) = ?
othermap
无法生成类型为b
或d
的值,因为在这两种情况下它都不能调用f
。
第一个参数的类型暗示了一个与
(,)
同构的双函数函数,这并不是所有可能的双函数函数都是如此。(这里似乎有一种逆向关系,我不会试图精确说明。)
一种类型的双功能转换器不需要具有与b
值相同数量的A
值。例如,考虑一下
data TwoLists a b = TwoLists [a] [b]
很容易实现bimap
,但是othermap
是一个真正的问题,尤其是当其中一个列表为空时。
othermap f (TwoLists [] (b:bs)) = TwoLists [] _
你在这里能做什么?您需要调用f
来将所有的bs
转换为类型[d]
的列表,但是您只能在手头有a
的情况下调用该函数。
也许更糟糕的是,这种类型根本没有b
值:
data TaggedFuncthtml" target="_blank">ion k a b = TaggedFunction a (k -> b)
instance Bifunctor (TaggedFunction k) where
bimap f g (TaggedFunction a b) = TaggedFunction (f a) (g . b)
如何实现此类型的ourmap
?您可以更新这个函数,因为您已经有了一个a
,并且在您需要一个d
的时候将会有一个b
。但是您无法将a
替换为c
,因为您无法获得一个b
来调用其他map
的函数。
所以你不能把这个函数放在双功能器中。也许你在问,为什么不把这个放在一个新的班级里?我认为leftroundabout是对的,因为类太受约束而不有用。只有当你的结构中有相同数量的a
s和b
s时,也就是说当你的结构是一些仿函数f
包裹在类型(a, b)
的元组周围。例如,我们可以定义两个列表,而不是两个列表
newtype PairList a b = PairList [(a, b)]
这可以有一个othermap
定义。但它只是
othermap f (PairList vs) = PairList (fmap f vs)
同样,我们可以定义标签函数,而不是标签函数
newtype MultiFunction k a b = MultiFunction (k -> (a, b))
但是othermap
定义同样只是对fmap
的包装调用:
othermap f (MultiFunction g) = MultiFunction (fmap f g)
因此,也许最好的设想是将这个抽象定义为,不是一个类型类函数,而是一个普通函数,它在捕获这个组合的类型上运行:
newtype TupleFunctor f a b = TupleFunctor (f (a, b))
othermap :: Functor f => ((a, b) -> (c, d))
-> TupleFunctor f a b -> TupleFunctor f c d
othermap f (TupleFunctor x) = TupleFunctor (fmap f x)
我有一个支持以下操作的数据结构: 可以在固定时间内插入项目。对于该项,数据结构分配一个唯一的正整数。(说明:指定的整数不是插入项的函数,用户对指定的整数没有选择权。它完全由数据结构选择。) 它是使用指针数组实现的,其中指定的整数是存储项的索引。未使用的索引以链表方式链接起来,以便进行固定时间的插入。 这种数据结构的名称是/应该是什么?
问题内容: Python有一个有序的字典。有序套呢? 问题答案: 为此,有一个有序的设置(可能的新链接)配方,可从Python 2文档中引用。它可以在Py2.6或更高版本以及3.0或更高版本上运行,而无需进行任何修改。该接口几乎与普通集合完全相同,不同之处在于初始化应使用列表进行。 这是一个,因此for的签名 的签名不匹配,但是由于它包含类似的内容,因此可以轻松添加:
问题内容: 我正在尝试使用描述的技术在gradle项目中声明。 但是,当我这样做时,会出现此错误: 我怎样才能解决这个问题? 在顶层 build.gradle中 声明为属性的依赖 项 如下: 尝试在 模块级别的build.gradle中 检索依赖 项 (在其中引发错误): 引发错误: 问题答案: 在顶层,包括您的子项目: 在顶层定义ext属性: 如果您仅使用1个值,则不必一定是地图,但是我坚持使用
问题内容: 有没有一种方法可以检查nodestore的firestore中是否存在子集合? 目前,我正在使用文档,但是我需要检查文档中是否存在子类以便写入一些数据。 问题答案: 就在这里。您可以使用docs.length来知道子集合是否存在。 我制作了一个样本来指导您,希望对您有所帮助。
我在我的FiRecovery数据库中查询子集合内的所有文档时遇到困难。(我使用的是Node.js) 我的目标是从名为 我看了看留档https://firebase.google.com/docs/firestore/query-data/get-data但没有任何结果如何解决问题。 我现在的问题是这样的: 但是我得到了
我刚开始在应用程序中出现以下错误。当安装和运行同一个应用程序时,在安装看似成功之后,我会得到一条错误消息: 应用程序验证未成功