微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

{FlippyFloppyMorphism`是唯一的const mempty吗?

如何解决{FlippyFloppyMorphism`是唯一的const mempty吗?

在Haskell中,我们有一个有趣的事实,即同时是f :: * -> *Functor的任何类型构造函数Contravariant在其类型参数中都是幻像:

phantom :: (Functor f,Contravariant f) => f x -> f y

另一种表示方法是,对于某些Functor,同时为ContravariantConst x的每个类型构造函数自然与x同构。

这意味着实例化类的“唯一”方式(直至同构):

class FlippyFloppyFunctor f
  where
  ffmap :: Either (y -> x) (x -> y) -> f x -> f y

使其遵守函子定律:

ffmap (Left id)       = id
ffmap (Right id)      = id
ffmap (Left  (g . f)) = ffmap (Left f)  . ffmap (Left g)
ffmap (Right (f . g)) = ffmap (Right f) . ffmap (Right g)

是:

weirdmap :: Either (y -> x) (x -> y) -> Const r x -> Const r y
weirdmap = const $ \(Const x) -> Const x

即模新类型const id

我很难理解为什么这是其类型中唯一满足约束条件的功能,尽管我可以某种程度上理解涉及absurd :: Void -> a / discard :: a -> ()的各种非正式论点这样的映射意味着函子的类型参数“是幻像”。

为了更好地理解它,我尝试简化问题。不用考虑FlippyFloppyFunctor,而要考虑:

class (Monoid a,Monoid b) => FlippyFloppyMorphism a b
  where
  ffmorph :: Either a a -> b

具有类似法律:

ffmorph (Left mempty)    = mempty
ffmorph (Right mempty)   = mempty
ffmorph (Left  (y <> x)) = ffmorph (Left x)  <> ffmorph (Left y)
ffmorph (Right (x <> y)) = ffmorph (Right x) <> ffmorph (Right y)

假设ab are non-commutative monoids,是否仍然正确,FlippyFloppyMorphism的唯一合法实现是const mempty?仍然有可能解释为什么在没有输入Void()的情况下,输入单义词中的态射必须是“幻影”的吗?

解决方法

在我看来,一般情况下的答案是“否”,因为类半体词可以互换。

如果monoid是可交换的,则Dual aa是相同的monoid,而Either a aa是相同的,因此我们简并询问是否ffmorph是唯一的{} {1}}答案是“否”。

例如,对于加法的可交换monoid,我们有a -> b,其中:

replicate 'a' :: Either (Sum Int) (Sum Int) -> String

但是,我认为可能是_non_commutative monoids唯一可能的实现是replicateA (Left 0) = "" replicateA (Right 0) = "" replicateA (Left (y + x)) = replicateA (Left x) ++ replicateA (Left y) replicateA (Right (x + y)) = replicateA (Left x) ++ replicateA (Left y) (我仍然没有证明)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。