问题描述
我正在编写一个小型Scala程序,该程序应该:
- 从本地FS逐行读取文件
- 从每一行解析三个双精度值
- 根据这三个值创建案例类的实例
- 将这些实例传递到二进制堆
为了能够将String
和Double
都解析为CoordinatePoint
,我想出了以下特征:
trait Parseable[T] {
def parse(input: String): Either[String,T]
}
并且我为后者提供了许多类型对象实现:
object Parseable {
implicit val parseDouble: Parseable[Double] = new Parseable[Double] {
override def parse(input: String): Either[String,Double] = {
val simplifiedInput = input.replaceAll("[ \\n]","").toLowerCase
try Right(simplifiedInput.toDouble) catch {
case _: NumberFormatException =>
Left(input)
}
}
}
implicit val parseInt: Parseable[Int] = new Parseable[Int] {
override def parse(input: String): Either[String,Int] = {
val simplifiedInput = input.replaceAll("[ \\n]","").toLowerCase
try Right(simplifiedInput.toInt) catch {
case _: NumberFormatException =>
Left(input)
}
}
}
implicit val parseCoordinatePoint: Parseable[CoordinatePoint] = new Parseable[CoordinatePoint] {
override def parse(input: String): Either[String,CoordinatePoint] = {
val simplifiedInput = input.replaceAll("[ \\n]","").toLowerCase
val unparsedPoints: List[String] = simplifiedInput.split(",").toList
val eithers: List[Either[String,Double]] = unparsedPoints.map(parseDouble.parse)
val sequence: Either[String,List[Double]] = eithers.sequence
sequence match {
case Left(value) => Left(value)
case Right(doublePoints) => Right(CoordinatePoint(doublePoints.head,doublePoints(1),doublePoints(2)))
}
}
}
}
我有一个公共对象,该对象将调用委派给相应的隐式Parseable
(在同一文件中):
object InputParser {
def parse[T](input: String)(implicit p: Parseable[T]): Either[String,T] = p.parse(input)
}
仅供参考-这是CoordinatePoint
案例类:
case class CoordinatePoint(x: Double,y: Double,z: Double)
在我的主程序中(确认文件在那里,并且不为空,等等。)我想将每一行转换为CoordinatePoint
的实例,如下所示:
import Parseable._
import CoordinatePoint._
...
private val bufferedReader = new BufferedReader(new FileReader(fileName))
private val streamOfMaybeCoordinatePoints: Stream[Either[String,CoordinatePoint]] = Stream
.continually(bufferedReader.readLine())
.takeWhile(_ != null)
.map(InputParser.parse(_))
我得到的错误是:
[error] /home/vgorcinschi/data/eclipseProjects/Algorithms/Chapter 2 Sorting/algorithms2_1/src/main/scala/ca/vgorcinschi/algorithms2_4/selectionfilter/SelectionFilter.scala:42:27: ambiguous implicit values:
[error] both value parseDouble in object Parseable of type => ca.vgorcinschi.algorithms2_4.selectionfilter.Parseable[Double]
[error] and value parseInt in object Parseable of type => ca.vgorcinschi.algorithms2_4.selectionfilter.Parseable[Int]
[error] match expected type ca.vgorcinschi.algorithms2_4.selectionfilter.Parseable[T]
[error] .map(InputParser.parse(_))
[error] ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed
[error] Total time: 1 s,completed Sep 1,2020 10:38:18 PM
我不理解,也不知道在哪里寻找编译器为何找到Parseable[Int]
和Parseable[Double]
而不是唯一的权利-Parseable[CoordinatePoint]
。
所以我想,好的,让我先指定一下转换函数来帮助编译器:
private val bufferedReader = new BufferedReader(new FileReader(fileName))
val stringTransformer: String => Either[String,CoordinatePoint] = s => InputParser.parse(s)
private val streamOfMaybeCoordinatePoints: Stream[Either[String,CoordinatePoint]] = Stream
.continually(bufferedReader.readLine())
.takeWhile(_ != null)
.map(stringTransformer)
可惜这只是在函数声明中的代码上方产生了相同的错误。
我很想知道是什么导致了这种行为。既要纠正代码又要获取个人知识。在这一点上,我很好奇。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)