【问题标题】:Pattern match is redundant模式匹配是多余的
【发布时间】:2016-10-04 22:22:24
【问题描述】:

Haskell,堆栈构建工具。

我有代码:

quote :: Char
quote = '\''

doubleQuote :: Char
doubleQuote = '\"'

isBorder :: Char -> Bool
isBorder quote = True
isBorder doubleQuote = True
isBorder _ = False

它会编译没有错误,但我在编译过程中看到了消息:

D:\haskell\real\app\Main.hs:34:1:警告:[-Woverlapping-patterns]
模式匹配是多余的
在 `isBorder' 的等式中:isBorder doubleQuote = ...

D:\haskell\real\app\Main.hs:35:1:警告:[-Woverlapping-patterns]
模式匹配是多余的
在 `isBorder' 的等式中: isBorder _ = ...

这是什么意思?我没有看到冗余......

【问题讨论】:

  • 如果您使用-Wall 启用警告,您还应该看到“阴影”警告。

标签: haskell pattern-matching


【解决方案1】:

在声明函数时,参数变量是新的名称。您的 quote 和 doubleQuote 正在隐藏函数,而不是调用函数进行模式匹配。这样,模式匹配的语言就微妙地偏离了右手表达式的语言。为了实现你想要的,要么做

isBorder :: Char -> Bool
isBorder '\'' = True
isBorder '\"' = True
isBorder _ = False

isBorder :: Char -> Bool
isBorder c | quote == c = True
isBorder c | doubleQuote == c = True
isBorder _ = False

原理是首先将参数绑定到名称,然后然后使用保护来调用计算结果为布尔值的表达式。

【讨论】:

  • 您可以将所有调用打包到一个顶级函数中。
  • 是的,我理解你,我认为你是对的。嗯...但是我看到我的代码也可以正常工作...所以 Haskell 理解我在定义中的意思。请看我的完整代码示例:yadi.sk/d/MfyG7OmHwGmsV
【解决方案2】:

模式只能与具体值匹配,不能与标识符匹配。

所以编译器本质上看到:

isBorder x = True
isBorder x = True

因为quotedoublequote 不是定义的标识符,而是参数的名称。

【讨论】:

  • > 因为引号和双引号不是定义的标识符,而是参数的名称。 嗯...但是我看到我的代码工作正常...所以 Haskell理解我在定义中的意思。
  • 真的吗? isBorder '5' 是假的吗?
猜你喜欢
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 2011-10-20
  • 2010-11-26
  • 1970-01-01
相关资源
最近更新 更多