gpt4 book ai didi

haskell - 如何为所有 Monoid 编写长度函数

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

我正在以不同的方式重写简单的函数,我显然误解了一些核心概念。有没有更好的方法来处理像这样的有限类型?

mlength :: Monoid m => m -> Int
mlength mempty = 0
mlength (l <> r) = mlength l + mlength r

编译失败并出现以下错误:
Parse error in pattern: l <> r

我可以看到我对 <> 的使用被误导,因为 l 有多个正确匹配项和 r .尽管看起来分配哪个值并不重要,但最终仍然必须分配一个值。也许我有办法为特定的 Monoid 实例断言这个决定?
"ab" == ""   <> "ab" 
"ab" == "a" <> "b"
"ab" == "ab" <> ""

最佳答案

在一般情况下,幺半群没有长度的概念。以 Sum Int 为例,即 Int配备了用于其单向操作的加法。我们有

Sum 3 <> Sum 4 = Sum 7 = Sum (-100) <> Sum 7 <> Sum (100)
它的“长度”应该是多少?这里没有真正的长度概念,因为基础类型是 Int ,它不是类似列表的类型。
另一个例子: Endo Int 这是 Int -> Int配备组成。例如。
Endo (\x -> x+1) <> Endo (\x -> x*2) = Endo (\x -> 2*x+1)
同样,这里不能定义有意义的“长度”。
您可以浏览 Data.Monoid 并查看没有“长度”概念的其他示例。
Const a 也是一个没有长度的(无聊的)幺半群。
现在,确实列出了 [a]形成一个幺半群( a 上的自由幺半群),并且确实可以在那里定义长度。不过,这只是一个特例,不能一概而论。

关于haskell - 如何为所有 Monoid 编写长度函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60236587/

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