【问题标题】:Is there a better way to rewrite this function?有没有更好的方法来重写这个函数?
【发布时间】:2013-02-10 09:52:06
【问题描述】:

有没有更好的方法来重写foo[T]函数?

implicit def stringConverter(s: String) = new {
  def convert[T](): Option[T] = { //converts s: String to Option[T] }
}
def foo[T](m: Map[String,Buffer[String]], k: String): List[T] = 
  m.get(k).flatMap { x => x.map(_.convert[T]).filterNot(_ == None).map(_.get).toList }.getOrElse(List())

【问题讨论】:

  • 实际上解释你想要达到的目标可能会有所帮助......

标签: scala functional-programming higher-order-functions


【解决方案1】:

这是我的建议(如果我的逻辑正确的话):

import scala.collection.mutable.Buffer

// Implementation.
trait StringConverter[T] {
  def convert(string: String): Option[T]
}

def foo[T](m: Map[String,Buffer[String]], k: String)
          (implicit converter: StringConverter[T]): List[T] = 
  for {
    lookupFromMap <- m.get(k).toList
    valueFromList <- lookupFromMap.toList
    convertedValueFromList <- converter.convert(valueFromList).toList
  } yield convertedValueFromList


// Instance.
implicit val intConverter: StringConverter[Int] = new StringConverter[Int] {
  def convert(string: String): Option[Int] = Some(string.length)
}

val map = Map("one" -> Buffer("1", "11"), "two" -> Buffer("2", "222222222"))

println(foo[Int](map, "one"))
println(foo[Int](map, "two"))
println(foo[Int](map, "three"))

我将它分为两​​个主要部分,一个是基本的通用实现,另一个是它正在使用的实例。 convert 方法已被移动到具有 StringConverter trait 的 typeclass 使用风格,因为原始的 convert 方法本身并不能真正起作用。

除此之外,主要的变化只是将所有内容都转换为 for 理解中的列表:

  • 首先,我们将 Option 从 .get 调用转换为 List。
  • 然后将Buffer变成List。
  • 转换的结果变成了一个List。

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多