haskell - 与幺半群的冗余模式匹配

标签 haskell

以下函数定义了一个字符串的漂亮连接,即不累积空格的字符串:

(><) :: String -> String -> String
x >< "" = x
"" >< y = y
x >< y  = x <> " " <> y

以下应该是对任何 IsString 的概括。类型。输入 a需要在Monoid为了与 mconcat 连接的类(= <> 来自 Semigroup ):
(><) :: (Monoid a, IsString a) => a -> a -> a
x >< mempty = x
mempty >< y = y                          -- redundant pattern match!
x >< y  = x <> (fromString " ") <> y     -- redundant pattern match!

现在,奇怪的是,GHC 警告说第二行和第三行是冗余模式匹配。

这很奇怪。我什至不清楚 a(Monoid a, IsString a)但不是 Eq a可以在这里使用。

然而,起作用的是:
(<+>) :: (Monoid a, IsString a, Eq a) => a -> a -> a
x <+> "" = x
...

任何人都可以对此有所了解吗?

最佳答案

mempty这里只是一个变量名。你也可以写

x >< y = x
x >< y = y
x >< y = ...

当您引入与现有绑定(bind)同名的新模式时,Haskell 不会自动进行相等测试 - 它只是隐藏现有绑定(bind)。如果你想要平等,你必须用 == 要求它。测试,例如在保护条款中。
x >< y
    | x == mempty = y
    | y == mempty = x
    | otherwise = x <> " " <> y

关于haskell - 与幺半群的冗余模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57799777/

相关文章:

haskell - 在 Haskell 中使用 Dynamic/fromDynamic 时是否可以恢复约束?

haskell - 匿名记录:在Haskell中键入级标记的方法是什么?

haskell - 为什么 splitAt 函数的惰性模式匹配版本更快?

haskell - 高性能 Haskell 哈希结构。

haskell - 为什么即使在下面的示例中,n-reduction 也不适用于过滤器?

math - Haskell 浮点错误

haskell - 如何使用自定义App类型代替IO?

haskell - lambda 表达式的模式匹配

haskell - 提示符下的单子(monad)?

haskell - 在 Haskell 中以通用方式扩充复杂数据类型