以cats / scalaz遍历字符串

时间:2018-10-07 17:46:50

标签: scala scalaz scala-cats

我想通过以下方式遍历字符串:

import cats.implicits._

object RnaTranscription {
  val mMap: Map[Char, Option[Char]] =
    Map('G' -> Some('C'),
        'C' -> Some('G'),
        'T' -> Some('A'),
        'A' -> Some('U')).withDefaultValue(None)

  def toRna(dna: String): Option[String] = {
    dna.toList.traverse(mMap).map(_.mkString)
  }
}

但是它有额外的步骤,我需要先转换为List[Char],然后再转换为mkString,在cat或scalaz中是否有一种方法可以遍历String而无需转换为列表?

2 个答案:

答案 0 :(得分:4)

正如@BogdanVakulenko在其回答中所暗示的,requests不是FunctorString)。

cats中的F[_]类型类具有以下声明:

Traverse

@typeclass trait Traverse[F[_]] extends Functor[F] with Foldable[F] with UnorderedTraverse[F] { self => ... } toList解决问题的方式对我来说很好,但是,如果您希望使用普通的Scala原始版本,则可以:

mkString

答案 1 :(得分:2)

也许是这样的:

def toRna(dna: String): Option[String] = {
  Some(dna.map(mMap).flatten.mkString)
}

由于字符串是本机Java结构,因此无法直接在字符串上使用遍历。 cats / scalaz内部有一个隐式转换,它将遍历方法添加到集合中。此隐式仅适用于具有一个类型参数((* *>)或F[_])的类型。字符串只是T,因此scala无法应用此隐式转换。

implicit def toTraverseOps[F[_], C](target : F[C])
            (implicit tc : cats.Traverse[F]) : Traverse.Ops[F, C]