我正在以不同的方式重写简单的函数,我显然误解了一些核心概念。有没有更好的方法来处理像这样的有限类型?
mlength :: Monoid m => m -> Int
mlength mempty = 0
mlength (l <> r) = mlength l + mlength r
编译失败并出现以下错误:
Parse error in pattern: l <> r
我可以看到我的使用被误导了,因为and<>
有多个正确的匹配项。尽管看起来分配哪个值并不重要,但最终仍然必须分配一个值。也许我有办法为特定的 Monoid 实例断言这个决定?l
r
"ab" == "" <> "ab"
"ab" == "a" <> "b"
"ab" == "ab" <> ""