scala - 与连词的模式匹配(Pattern AND Pattern)

标签 scala pattern-matching

Scala 具有支持模式匹配中析取的语言功能(“模式替代”):

x match {
    case _: String | _: Int => 
    case _ =>
}

但是,如果审查满足 PatternA PatternB (联合),我经常需要触发一个操作。

我创建了一个模式组合器“&&”来添加此功能。三句小诗让我想起了为什么我喜欢 Scala!

// Splitter to apply two pattern matches on the same scrutiny.
object && {
  def unapply[A](a: A) = Some((a, a))
}

// Extractor object matching first character.
object StartsWith {
  def unapply(s: String) = s.headOption
}

// Extractor object matching last character.
object EndsWith {
  def unapply(s: String) = s.reverse.headOption
}

// Extractor object matching length.
object Length {
  def unapply(s: String) = Some(s.length)
}

"foo" match {
  case StartsWith('f') && EndsWith('f') => "f.*f"
  case StartsWith('f') && EndsWith(e) && Length(3) if "aeiou".contains(e) => "f..[aeiou]"
  case _ => "_"
}

讨论要点

  1. 有现成的方法可以做到这一点吗?
  2. 这种方法有问题吗?
  3. 这种方法可以创建任何其他有用的组合器吗? (例如,)
  4. 是否应该将这样的组合器添加到标准库中?

更新 我刚刚被问到编译器如何解释 case A && B && C。这些是中缀运算符模式(Scala 引用的第 8.1.9 节)。您还可以使用标准提取模式 (8.1.7) 将其表达为 &&(&&(A, B), C)。请注意表达式如何从左到右关联,按照正常的中缀运算符方法调用,如 Boolean#&&inval b = true && false && true`。

最佳答案

我真的很喜欢这个技巧。我不知道有任何现有的方法可以做到这一点,而且我预计它不会出现任何问题——但这并没有多大意义。我想不出任何方法来创建 Not

至于将其添加到标准库中......也许吧。但我觉得有点难。另一方面,如何说服 Scalaz 人员将其纳入其中?它看起来更像是他们自己的辖区。

关于scala - 与连词的模式匹配(Pattern AND Pattern),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2261358/

相关文章:

scala - 如何以迭代器或流的形式遍历一棵 n 叉树

java - 如何使用 Java Regex 查找字符串中所有重复的字符序列?

javascript - 为什么这个正则表达式匹配?

haskell - 模式匹配与 guard 混合

javascript - 正则表达式:仅允许使用数字或包含 '-' 和 '_' 的字母数字,但不允许包含包含 '-' 和 '-' 的数字

scala - 遍历元组

java - IntelliJ 中自定义逗号优先格式的设置

scala - 如何实现 Functor[数据集]

scala - 类型安全堆栈 scala 错误

pattern-matching - 以编程方式比较两行(库存模式匹配)