以下函数定义了一个字符串的漂亮连接,即不累积空格的字符串:
(><) :: 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/