Haskell 唯一的“flipyFloppyMorphism”是“const mempty”吗?
在Haskell中,我们有一个有趣的事实,即任何类型构造函数Haskell 唯一的“flipyFloppyMorphism”是“const mempty”吗?,haskell,monoids,typeclass-laws,Haskell,Monoids,Typeclass Laws,在Haskell中,我们有一个有趣的事实,即任何类型构造函数f::*->*同时是函子和逆变在其类型参数中都是幻影: phantom :: (Functor f, Contravariant f) => f x -> f y 另一种说法是,对于某些x,同时是函子和反变量的每个类型构造函数自然同构于常量x 这意味着实例化类的“唯一”方法(直到同构): class FlippyFloppyFunctor f where ffmap :: Either (y -> x) (x
f::*->*
同时是函子
和逆变
在其类型参数中都是幻影:
phantom :: (Functor f, Contravariant f) => f x -> f y
另一种说法是,对于某些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)
是:
i、 e.模新类型,const id
我发现很难理解为什么这是其类型中唯一满足约束的函数,尽管我可以理解各种非正式的参数,包括russic::Void->a
/discard::a->()
,为什么这样一个映射的存在意味着其类型参数中的函子“是幻影”
为了更好地理解它,我试图简化这个问题。与其考虑FlipyFloppyFunctor
,不如考虑:
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)
ffmorph(Left mempty)=mempty
ffmorph(右mempty)=mempty
ffmorph(左(y x))=ffmorph(左x)ffmorph(左y)
ffmorph(右(x y))=ffmorph(右x)ffmorph(右y)
假设a
和b
,那么flipyFloppyMorphism
的唯一合法实现是否仍然是const mempty
?还有可能解释为什么输入幺半群中的态射必须是“幻影”,而不需要引用Void
或()
?在我看来,一般情况下的答案是“否”,因为幺半群可以是交换的
如果幺半群是可交换的,那么对偶a
与a
是相同的幺半群,或者a
与a
是相同的,因此我们退化为询问ffmorph
是否是唯一的幺半群同态a->b
。答案是“不”
例如,对于加法的交换幺半群,我们有复制'a'::任择(Sum Int)(Sum Int)->String
,其中:
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)
然而,我认为可能的情况是,对于非交换幺半群,唯一可能的实现是constmempty
(我仍然没有证据)。到底什么是ExistsF
?“我似乎无法用胡格尔找到它。@布拉德恩对不起,这是早期草稿的产物,让我把它处理掉。(完成)我已经读了好几遍了,但我不确定我是否理解FlippyFloppyMorphism
与FlippyFloppyFunctor
的关系……你能给出一个FlippyFloppyMorphism
实例的例子吗?这可能会有点帮助。@bradrn这正是问题所在。我能想到的唯一合法的例子是ffmorph=const mempty
。你能想到其他人吗,或者一个关于为什么不应该存在的论点?我想不出有什么,但同时我也无法解释为什么不应该存在。啊,是的,我现在看到了这种关系。ffmorph
定律就是ffmap
定律,用(.)替换(
)。(不确定为什么我以前没有看到!)我认为这个答案可能需要更正,因为编辑从问题中删除了Dual
。@bradrn我认为答案是正确的,我在写的过程中意识到我犯了问题中的错误。这个想法是,我们要么需要在中翻转组合/附加的顺序(左(y x))
,要么需要使用新类型翻转
本身。我在问题中两个都做了,这基本上导致左
案例与右
案例相同。@bradrn啊,没关系,你是对的。在回答中,我确实有一个关于Dual
的错误引用。谢谢是的,我刚才说的就是“误传参考”。
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)