解析器组合器阻止字符串映射

时间:2015-11-18 19:25:16

标签: scala implicit-conversion ambiguous parser-combinators implicits

import scala.util.parsing.combinator._

object SimpleArith extends JavaTokenParsers {
    "abc".map(identity)

生成

  

类型不匹配; found:String(“abc”)必需:?{def map:?}注意   隐式转换不适用,因为它们是   不明确:两个方法都是对象Predef中的augmentString类型(x:   String)scala.collection.immutable.StringOps和方法文字   特性RegexParsers类型(s:String)SimpleArith.Parser [String]是   可能的转换函数从String(“abc”)到?{def map:?}

你是如何解决的?

2 个答案:

答案 0 :(得分:1)

我能想到三种方式。首先,您可以调用特定的所需隐式函数(它总是可以显式使用):

augmentString("abc").map(identity)

其次,强制转换为所需类型(这需要您导入scala.collection.immutable.StringOps,或指定完全限定的类名称):

("abc": StringOps).map(identity)

第三,您可以将.map或其他字符串操作代码移动到解析器隐含的其他地方的方法中,并调用该方法。例如:

trait StringMappings {
  def mapStr(str: String) = str.map(identity)
}

import scala.util.parsing.combinator._

object SimpleArith extends JavaTokenParsers with StringMappings {
  mapStr("abc")
}

答案 1 :(得分:0)

不是效率最高但是像我这样的任何菜鸟都可以使用toList of char

str.toList.map ...