匹配Haskell中的任何列表

Rad*_*scu 2 haskell

有没有办法模式匹配任何列表而不迭代这两种情况:空列表还是非空列表?

我想修复以下代码:

foo [] = "something else"
foo [_:_] = "something else"
Run Code Online (Sandbox Code Playgroud)

由于部分something else 是相同的,我想从一个地方删除它.

谢谢.

Sar*_*rah 8

模式_匹配任何内容而不将其绑定到名称.一个名字,比如说,xs也匹配任何东西.所以你可以这样做:

foo _ = "something else" 要么 foo xs = "something else"

如果"其他东西"真的不依赖于xs第一种形式的值是首选,那么另一位程序员(和你)可以很快发现该值在这个特定的等式中是无关紧要的.

不幸的是,你的第一个案例已经是第二种形式,因此它符合所有可能性.永远不会达到其他情况.

  • 如果由于某种原因你想给被忽略的参数一个名字,`foo _xs ="别的东西"` - 用下划线开头名字会阻止未使用的变量警告. (3认同)
  • 另外,对于`-Wall`,如果你在模式头中提到它,GHC会警告usused变量`xs`.下划线不是变量,因此不会发出此警告. (2认同)