【发布时间】:2020-09-25 07:21:00
【问题描述】:
在 Haskell 中,我们有一个有趣的事实,即任何类型构造函数 f :: * -> * 同时是 Functor 和 Contravariant 在其类型参数中都是幻像:
phantom :: (Functor f, Contravariant f) => f x -> f y
另一种说法是,同时为Functors 和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 或 () 可供参考?
【问题讨论】:
-
ExistsF到底是什么?我似乎无法使用 Hoogle 找到它。 -
@bradrn 抱歉,这是早期草稿的产物,让我摆脱它。 (完成)
-
我已经读了几遍了,但我不确定我是否理解
FlippyFloppyMorphism与FlippyFloppyFunctor的关系...你能举一个FlippyFloppyMorphism实例的例子吗?这可能会有所帮助。 -
@bradrn 这正是问题所在。我能想到的唯一合法的例子是
ffmorph = const mempty。你能想到任何其他人,或者关于为什么不应该存在的论点吗?我想不出任何东西,但同时我无法就为什么不应该存在提出论据。 -
啊,是的,我现在看到了这种关系……
ffmorph法律只是ffmap法律,(.)被(<>)取代。 (不知道为什么我以前没看到!)
标签: haskell monoids typeclass-laws