y 以下应该是对任何 IsString 的概括。类型。输入 a需要在Monoi-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:09:13 24 4
gpt4 key购买 nike

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

(><) :: 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/

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