gpt4 book ai didi

Haskell,实现幺半群。什么是 Semigroup,为什么它表现得如此奇怪?

转载 作者:行者123 更新时间:2023-12-05 08:19:31 26 4
gpt4 key购买 nike

我想实现一个名为 ComplexNumber 的自定义数据类型,如下所示:数据 ComplexNumber a = C (a,a)

现在我想实现 Monoid 变量并定义二进制 mempty 元素和 mappend,如下所示:

instance Num a => Monoid (ComplexNumber a) where
mempty = C (0,0)
mappend = (C (a1, b1)) (C (a2, b2)) = C (a1 + a2, b1 + b2)

但这没有成功,所以试图找出原因并遇到了 Semigroup(我仍然不太了解)并得出了一个至少可以编译并且似乎可以解决这个问题的解决方案:

instance Num a => Semigroup (ComplexNumber a) where
(C (a1, b1)) <> (C (a2,b2)) = C (a1 + a2, b1 + b2)

instance Num a => Monoid (ComplexNumber a) where
mempty = C (0,0)

有趣的是,当我删除 Semigroup 的实现时,程序不再编译并给出以下错误:

    * Could not deduce (Semigroup (ComplexNumber a))
arising from the superclasses of an instance declaration
from the context: Num a
bound by the instance declaration at Aufgabe_10.hs:9:10-42
* In the instance declaration for `Monoid (ComplexNumber a)'
|
9 | instance Num a => Monoid (ComplexNumber a) where
|

为什么我可以将这两个部分编译在一起,但是当我删除半群时会发生错误?尤其是这个 Semigroup 是什么

最佳答案

Semigroup只是具有 <> 实现的所有类型的类操作,以某种方式使其具有关联性(即 a<>(b<>c) ≡ (a<>b)<>c ,如果我们忽略小的浮点偏差,它确实适用于您的复数)。

Monoid是另外具有中性元素的半群类 mempty ,即始终满足 mempty <> a ≡ a <> mempty ≡ a 的元素(对于加法和零的复数也是如此)。
对于一个甚至没有 <> 的类型来说,这将是一个 absurd 的要求。操作,即没有 Semigroup实例。这由 Semigroup 表示作为 Monoid父类(super class) , 因此不可能有一个类型是 Monoid 的实例但不是 Semigroup .

历史上, SemigroupMonoid是单独的类(class),较旧的Monoid自己发货mappend相当于现代的操作 <> .一些较旧的书籍/教程仍然基于这个旧的类层次结构。
但是因为有一堆类型只是半群,而不是幺半群,所以类层次结构发生了变化。 p>

关于Haskell,实现幺半群。什么是 Semigroup,为什么它表现得如此奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73111476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com