作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想通过以下方式遍历字符串:
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 => ... }
你用toList
和mkString
解决这个问题的方式对我来说没问题,但是,如果你想要一个简单的普通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/
我是一名优秀的程序员,十分优秀!