Haskell 唯一的“flipyFloppyMorphism”是“const mempty”吗?

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

在Haskell中,我们有一个有趣的事实,即任何类型构造函数
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)