如何解决{FlippyFloppyMorphism`是唯一的const mempty吗?
在Haskell中,我们有一个有趣的事实,即同时是f :: * -> *
和Functor
的任何类型构造函数Contravariant
在其类型参数中都是幻像:
phantom :: (Functor f,Contravariant f) => f x -> f y
另一种表示方法是,对于某些Functor
,同时为Contravariant
和Const 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)
假设a
和b
are non-commutative monoids,是否仍然正确,FlippyFloppyMorphism
的唯一合法实现是const mempty
?仍然有可能解释为什么在没有输入Void
或()
的情况下,输入单义词中的态射必须是“幻影”的吗?
解决方法
在我看来,一般情况下的答案是“否”,因为类半体词可以互换。
如果monoid是可交换的,则Dual a
与a
是相同的monoid,而Either a a
与a
是相同的,因此我们简并询问是否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 举报,一经查实,本站将立刻删除。