我正在尝试在 Scala 中编写一些方便的函数来读取值数组。
我从一个函数开始,它将“1 1 2 3 5 8”之类的字符串转换为 Array[Int]:
def readInts(in: String) = in.split(" ").map(_.toInt)
这很好用,除了如果我想读取的不仅仅是 Ints 而是 Longs 或 BigInts 或 Doubles,我需要为每个函数定义一个函数,这似乎很浪费(特别是如果我推广到读取矩阵或其他复合数据)
我希望能够编写一个多态函数,如下所示:
def readArray[A](in: String) = in.split(" ").map(_.to[A])
据我了解,这是不可能的,因为 String 类没有多态的“to”方法。好吧; 我将尝试将其定义为辅助方法:
def to[A](in: String) = ???
似乎我需要根据类型参数有条件地定义方法 - 如果 A 是 Int,则调用in.toInt
; 如果 A 是 Double,则调用in.toDouble
; 如果 A 是 Tuple2[Int,Int],则调用辅助方法toTupleOfInts(in)
。据我所知,这也是不可能的。
在我知道的另一种函数式语言 Haskell 中,这个问题是由“Read”类型类处理的,它定义了一个多态函数“read”,它可以从 String 转换为所需的数据类型。
在 Scala 中执行此操作(即编写多态输入函数)的惯用方法是什么?