scala - 遍历 cats/scalaz 中的字符串

标签 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,cats或scalaz中有没有办法遍历字符串不转换到列表?

最佳答案

正如 @BogdanVakulenko 在他的回答中暗示的那样,String 不是 Functor (F[_])。

cats 中的 Traverse 类型类具有以下声明:

@typeclass trait Traverse[F[_]] extends Functor[F] with Foldable[F] with UnorderedTraverse[F] { self => ... }

你用toListmkString解决这个问题的方式对我来说没问题,但是,如果你想要一个简单的普通Scala版本,那就是:

  def toRnaScala(dna: String): Option[String] = {
    val maybeChars: immutable.Seq[Option[Char]] = dna.map(mMap)
    maybeChars.foldLeft(Option("")) {
      case (acc, Some(c)) => acc.map(_ + c)
      case (_, None) => None
    }
  }

关于scala - 遍历 cats/scalaz 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52691217/

相关文章:

java - 在 Play 2.5.x 中找不到类 play.api.cache.CacheApi 的构造函数

scala - Intellij 13 和导入 SBT 项目

scala - 如何在 scalaz 任务中关闭 AsyncHttpClient

scala - 如何在 Scala 中使用 for 代替 flatMap/map?

Scala 类型类理解接口(interface)语法

scala - playframework scala slick允许多少个属性

Scala:isInstanceOf 后跟 asInstanceOf

scala - 在元组中使用 FirstOption monoid 实例

scala - 设计从 channel 读取的引用透明函数

scala - Dotty 将如何改变 Scala 中的纯函数式编程?