gpt4 book ai didi

haskell - Haskell 错误中的 Semigroup/Monoid/Group 类型类层次结构

转载 作者:行者123 更新时间:2023-12-04 17:39:51 25 4
gpt4 key购买 nike

我正在尝试创建代数类型类的“层次结构”,如下所示:

class Semigroup a where
(.*) :: a -> a -> a
foldr1 (.*) = foldl1 (.*) -- GHCi error: "`foldr1' is not a (visible) method of class `Semigroup'"

class (Semigroup a) => Monoid a where
identity :: a
(.*) identity = id :: a -> a -- GHCi error: "`.*' is not a (visible) method of class `Monoid'"

class (Monoid a) => Group a where
inverse :: a -> a

因此,群是幺半群,幺半群是半群。但是,我收到类无法看到其父类的功能的错误。

这些错误让我感到困扰,因为我认为通过编写(例如) class (Semigroup a) => Monoid a类(class) Monoid a就能看到函数 (.*) .此外, foldr1 的类型Prelude 中没有限制,所以我假设 foldr1在这种情况下会起作用。

最佳答案

Haskell 不允许您根据项声明(或强制执行)方程(就像您想要做的那样)。这是出于一个非常实际的原因:在像 Haskell 这样丰富的编程语言中证明任意项之间的相等性是不可判定的。检查人工构建的证明通常是可判定的,但在编程时必须编写和跟踪这些证明也有些烦人。

尽管如此,如果这是您想要定期做的事情,有些语言可以使这成为可能。要搜索的术语是“依赖类型”。例如,Coq 和 Agda 可能是目前最流行的两种依赖类型语言,每种语言都会让编写仅由良好的、守法的半群(或幺半群)居住的类型变得非常简单。

关于haskell - Haskell 错误中的 Semigroup/Monoid/Group 类型类层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6675912/

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