加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

数组 – 如何在Scala中编写多态输入函数?

发布时间:2020-12-16 09:52:48 所属栏目:安全 来源:网络整理
导读:我正在尝试在 Scala中编写一些便利函数来读取值数组. 我开始使用一个函数将类似“1 1 2 3 5 8”的字符串转换为Array [Int]: def readInts(in: String) = in.split(" ").map(_.toInt) 这样做很好,除非我想读不仅仅是Ints而是Longs或BigInts或Doubles,我需要
我正在尝试在 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读