当前位置: 首页 > 知识库问答 >
问题:

是否有此BIFunctor子集的名称?

谭繁
2023-03-14

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

共有2个答案

方宏富
2023-03-14

(扩展@glennsl的评论…)

类型pac“包含ac

但是类型为(a,c)的函数-

othermap @Either :: ((a, c) -> (b, d)) -> Either a c -> Either b d
othermap f (Left x) = ?
othermap f (Right y) = ?

othermap无法生成类型为bd的值,因为在这两种情况下它都不能调用f

第一个参数的类型暗示了一个与(,)同构的双函数函数,这并不是所有可能的双函数函数都是如此。(这里似乎有一种逆向关系,我不会试图精确说明。)

梁丘招
2023-03-14

一种类型的双功能转换器不需要具有与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是对的,因为类太受约束而不有用。只有当你的结构中有相同数量的as和bs时,也就是说当你的结构是一些仿函数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)
 类似资料:
  • 我有一个支持以下操作的数据结构: 可以在固定时间内插入项目。对于该项,数据结构分配一个唯一的正整数。(说明:指定的整数不是插入项的函数,用户对指定的整数没有选择权。它完全由数据结构选择。) 它是使用指针数组实现的,其中指定的整数是存储项的索引。未使用的索引以链表方式链接起来,以便进行固定时间的插入。 这种数据结构的名称是/应该是什么?

  • 问题内容: 我正在尝试使用描述的技术在gradle项目中声明。 但是,当我这样做时,会出现此错误: 我怎样才能解决这个问题? 在顶层 build.gradle中 声明为属性的依赖 项 如下: 尝试在 模块级别的build.gradle中 检索依赖 项 (在其中引发错误): 引发错误: 问题答案: 在顶层,包括您的子项目: 在顶层定义ext属性: 如果您仅使用1个值,则不必一定是地图,但是我坚持使用

  • 问题内容: Python有一个有序的字典。有序套呢? 问题答案: 为此,有一个有序的设置(可能的新链接)配方,可从Python 2文档中引用。它可以在Py2.6或更高版本以及3.0或更高版本上运行,而无需进行任何修改。该接口几乎与普通集合完全相同,不同之处在于初始化应使用列表进行。 这是一个,因此for的签名 的签名不匹配,但是由于它包含类似的内容,因此可以轻松添加:

  • 问题内容: 有没有一种方法可以检查nodestore的firestore中是否存在子集合? 目前,我正在使用文档,但是我需要检查文档中是否存在子类以便写入一些数据。 问题答案: 就在这里。您可以使用docs.length来知道子集合是否存在。 我制作了一个样本来指导您,希望对您有所帮助。

  • 我在我的FiRecovery数据库中查询子集合内的所有文档时遇到困难。(我使用的是Node.js) 我的目标是从名为 我看了看留档https://firebase.google.com/docs/firestore/query-data/get-data但没有任何结果如何解决问题。 我现在的问题是这样的: 但是我得到了

  • 我刚开始在应用程序中出现以下错误。当安装和运行同一个应用程序时,在安装看似成功之后,我会得到一条错误消息: 应用程序验证未成功