【发布时间】:2018-07-18 08:09:52
【问题描述】:
我找不到 fmap 的双函子模拟。
解释:
对象的函子 - 数据类型构造函数。类型 -
a -> f a
函数的函子 - fmap。类型 - (a -> b) -> (fa -> fb)
对象的双函子 - bimap f g 的结果,其中f :: (a -> a'),g :: (b -> b')。类型 - p a b -> p a' b'
函数的双函子 - ?。类型 - p (a -> b) (c -> d) -> p (a' -> b') (c' -> d')
这就是为什么我认为双函子有这种类型(对吗?)并举个例子
更新
更新2
上图中的p (a -> b) (c -> d) -> p (a' -> b') (c' -> d')是双函子到双函子的态射,也是profunctor(因为所有的函数都是profunctor)
总结:
我认为p (a -> b) (c -> d) -> p (a' -> b') (c' -> d') 是函数的双函子,但事实并非如此。态射的双函子是bimap. Type: (a -> b) -> (α -> β) -> p a α -> p b β.
我认为p (a -> b) (c -> d) -> p (a' -> b') (c' -> d') 是不寻常的东西,但它不是,它只是功能
【问题讨论】:
-
一个函数是一个profunctor,它在参数上是逆变的(
contramap),在返回类型上是协变的(fmap)。它被称为dimap:dimap :: (a -> b) -> (c -> d) -> p b c -> p a d。对于箭头类型:(a -> b) -> (c -> d) -> (b -> c) -> a -> d(hackage.haskell.org/package/profunctors-5.3/docs/…) -
@YuvalItzchakov 按照我的例子,如何使用
dimap获得(Int, Float) -> (Id Int, Id2 Float)类型的函数? -
如果我的理解正确的话,我认为标题可能会有点误导。我认为您是在说:任何函子都有两个“部分”,一个类型级部分(您称其为“对象的函子”,但我绝对建议说类型级)和值级部分(这是
fmap) 并且您正在询问双函子的价值级别部分是什么。你问的是这个吗? (顺便说一句,如果是,“对象的函子”部分是不正确的。它处于类型级别,您正在谈论数据构造函数,如果我解释正确,它们是值级别)。 -
再读一遍,我不太确信我之前阅读问题的方式是正确的。也许你可以稍微改写一下?您提到的所有内容具体是什么意思(例如
Id和Id2以及类型签名p (a -> b) (c -> d) -> p (a' -> b') (c' -> d')与您要询问的其他内容有什么关系)? -
@DavidYoung re
what relation- 图片上有