【发布时间】:2018-10-22 07:39:50
【问题描述】:
由于提取器无法采用自定义参数(如Stack Overflow: Can extractors be customized... 中的回答),我尝试找到解决以下问题的替代方法。
我有很多可以组合的翻译。在我的代码 sn-p 中,一个维度可以与一个因子相结合。例如"width multiplied by 2"。但它也可以是"width"(未相乘)。而且还会有更多类似的案例。我尝试使用模式匹配对这些字符串输入进行分类。 "width" 和"width multiplied by x" 应归类为“宽度”(键"w"),"height" 和"height multiplied by x" 应归类为“高度”(键"h"),依此类推。
这应该由以下示例代码 sn-p 中的最后一个 match 完成,其中将包含许多案例(示例代码 sn-p 中的 6 个)每个案例都应采用 key: String 参数(@987654332 @、"h"、"l"、"r"、"t"、"b")。
我试图实现的是将密钥(即"w"、"h"、"l"、"r"、"t"、"b" 等)传递给案例Untranslation(v)。但显然我不能这样做(unapply 函数可以采用隐式参数,但没有额外的显式参数)。
现在我尝试找到一种替代但仍然简洁的方法来对我的字符串输入进行分类。
implicit val translations = Map(
"w" -> "width",
"h" -> "height",
"l" -> "left",
"r" -> "right",
"t" -> "top",
"b" -> "bottom",
// + some more translations
"m" -> "multiplied by"
)
sealed trait CommandType
object CommandType {
case object Unmodified extends CommandType
case object Multiplied extends CommandType
// ...
}
object Untranslation {
def unapply(s: String)(implicit t: Map[String, String]): Option[CommandType] = {
val key: String = "w" // should be variable by case
val a: List[String] = t(key).split(" ").toList
val b: List[String] = t("m").split(" ").toList
val ab: List[String] = a ++ b
s.split(" ").toList match {
case `a` => Some(CommandType.Unmodified)
case `ab` :+ value => Some(CommandType.Multiplied)
// + some more cases
case _ => None
}
}
}
"width multiplied by 2" match {
case Untranslation(v) => println(v) // here I would like to pass the key ("w"/"h"/"l"/...)
case _ => println("nothing found")
}
// outputs: Multiplied
【问题讨论】:
-
我完全不明白你想在那里做什么。如果你想用“命令”做一些事情,你为什么不正确地解析它,然后相应地解释解析的结构呢?为什么要“分类”任何东西?为什么不能只检查命令
startsWith是否有某个词?我什至不明白您所说的“翻译”是什么意思:您是指几何翻译(似乎是半可信的,因为您在谈论宽度和高度以及因素等),还是您的意思是语言之间的翻译(哪些语言?) ? -
@AndreyTyukin,我必须猜测不是 OP,但我认为这个案例与不同的人类语言有关。我想目标是将一个以已知固定语言传入的字符串解析为内部抽象表示。并且计划似乎是
t自己包含所有相关部分的翻译。所以对于英语t("w")是"width"和t("m")是"multiplied by"。看起来 OP 希望使用模式匹配来解析将映射到"wm(value)"和"hm(value)"等等的字符串,而只是"w"或只是"h"等等。 -
@SergGr 如果是这种情况,那么 OP 应该阅读有关具有注意力机制的堆叠长短期记忆神经网络以及什么不是...尝试用一些复杂的硬-编码模式匹配似乎与其他人所做的一切相去甚远。
-
@AndreyTyukin,我同意现实世界的人类语言比这种简单的结构要复杂得多,但可能是被解析的文本实际上是一种完全符合这种结构的伪自然语言。更重要的是,您问了这个问题的含义,在我看来,我上面的解释非常适合代码和文本。
标签: scala pattern-matching extractor unapply