gpt4 book ai didi

haskell - 为什么 GHC 不能为 Monoid 派生实例?

转载 作者:行者123 更新时间:2023-12-02 01:24:59 25 4
gpt4 key购买 nike

GHC 有一些语言标志,例如 DeriveFunctor , DeriveDataTypeable等等,这使得编译器能够为类型类生成派生实例,而不是在 Haskell 98 中允许的类型。这对于像 Functor 这样的东西尤其有意义。 ,该类的法律规定了一个明显的“自然”派生实例。

那么为什么不为 Monoid ?对于具有单个数据构造函数的任何数据类型来说,似乎是这样的:

data T = MkT a b c ...

可以机械地生产 Monoid实例(请原谅伪代码):
instance (Monoid a, Monoid b, Monoid c, ...) => Monoid T where
mempty =
MkT mempty mempty mempty ...
mappend (MkT a1 b1 c1 ...) (MkT a2 b2 c2 ...) =
MkT (mappend a1 a2) (mappend b1 b2) (mappend c1 c2) ...

我知道 deriveprovides this ,但我的问题具体是 GHC 是否有原因。

最佳答案

不能推导出Monoid 真的是武断的决定,但是幺半群也是非常普遍的,所以通常有很多方法可以使一个类型成为幺半群。这是一个例子:

data T = A | B | C deriving (Eq, Ord, Enum)

type Mon a = (a, a -> a -> a)

m1, m2, m3, m4 :: Mon T
m1 = (A, max)
m2 = (C, min)
m3 = (A, \ x y -> toEnum $ (fromEnum x + fromEnum y) `rem` 3)
m4 = (B, f4)
f4 A _ = A
f4 B x = x
f4 C _ = C

这显示了四种合理的方法来制作 T一个幺半群( Mon 包含单位和二元运算)。第一个是取最大值的幺半群,第二个是取最小值的幺半群,第三个是取模 3 算术的幺半群,第四个是用于 Ordering 的幺半群类型。没有什么能真正突出自然的方式。

关于haskell - 为什么 GHC 不能为 Monoid 派生实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11165316/

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