gpt4 book ai didi

arrays - 如何在 Scala 中编写多态输入函数?

转载 作者:行者123 更新时间:2023-12-04 23:06:30 25 4
gpt4 key购买 nike

我正在尝试在 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 中执行此操作(即编写多态输入函数)的惯用方法是什么?

最佳答案

你可以做一些非常接近 Haskell 类型类的事情。但是,它不能自动派生(至少现在,也许宏会在将来的某个版本中允许这样做)

首先,定义一个特征,相当于类型类。

trait Read[A] {
def read(in: String): A
}

然后使一些实例隐式可用,最好在伴随对象中
object Read {

implicit object ReadInt extends Read[Int] {
def read(in: String): Int = in.toInt
}

implicit object ReadDouble ....

implicit def readArray[A](implicit readItem: Read[A]) : Read[Array[A]]
= new Read[Array[A]] {
def read(in: String) = in.split(" ").map(readItem.read _)
}

implicit def readTuple[A,B](implicit readA: Read[A], readB: Read[B]) ...

}

最后,定义一个方法,使 Read易于访问
def read[A](in: String[A])(implicit reader: Read[A]) = reader.read(in)

您可以对任何在隐式范围内有 Read 实例的类型调用 read。

关于arrays - 如何在 Scala 中编写多态输入函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11039729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com