我想通过以下方式遍历字符串:
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而无需转换为列表?
答案 0 :(得分:4)
正如@BogdanVakulenko在其回答中所暗示的,requests
不是Functor(String
)。
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]