函数式 Scala 的重构/布局

2024-01-10

这一班班轮...

 Console.println(io.Source.fromFile("names.txt").getLines.mkString.split(",").map{x:String => x.slice(1, x.length -1)}.sortBy { x => x}.zipWithIndex.map{t =>{ (t._2 +1)*(t._1.map{_.toChar - "A"(0).toChar + 1}.sum)}}.sum);

...是我的解决方案。它似乎有效,并且它是用(我的尝试)函数式风格编写的。

这个例子有点极端,但我的问题有点笼统——你喜欢如何编写/格式化/注释函数式代码?函数式方法似乎鼓励一系列方法调用,我发现这可能会变得不可读,并且也没有留下明显的注释位置。

另外,当我编写过程代码时,我发现我编写的小方法每个都有一个目的并且具有有意义的名称。当我编写函数代码时,我似乎正在养成一种习惯,生成有点像上面的行,其中(对我来说)其含义很难破译 - 而且各个计算也很难在其他地方重用。我在网上看到的很多功能代码示例(对我来说)同样简洁晦涩。

我应该做什么?为计算的每个部分编写小函数,并使用在当前上下文中有意义的名称? (即使它们只不过是地图的包装,比如说?)

对于我给出的例子,更好的编写和呈现方法是什么?

(像所有风格问题一样,这个问题是主观的。不过,没有理由对此进行争论!)


整理它的一个简单的第一次尝试就是删除前导部分Console.尾随的;和明确的:Stringtype - 所有这些都是不必要的 - 添加一些缩进并导入 io.Source:

import io.Source
println(
  Source.fromFile("names.txt").getLines.mkString.split(",").map{
    x => x.slice(1, x.length -1)
  }.sortBy {x => x}.zipWithIndex.map{
    t =>{ (t._2 +1)*(t._1.map{_.toChar - "A"(0).toChar + 1}.sum)}
  }.sum
)

下一步是稍微清理一下,在映射元组列表时使用模式匹配,identity代替x=>x. toChar对于字符来说也是不必要的,可以使用单引号来表示字符文字。

import io.Source
println(
  Source.fromFile("names.txt").getLines.mkString.split(",").map {
    x => x.slice(1, x.length -1)
  }.sortBy(identity).zipWithIndex.map {
    case (v, idx) =>{ (idx+1)*(v.map{_ - 'A' + 1}.sum)}
  }.sum
)

更多的更改也有助于使代码的意图更加清晰:

import io.Source
println(
  Source.fromFile("names.txt").getLines.mkString.split(",")
  .map { _.stripPrefix("\"").stripSuffix("\"") }
  .sortBy(identity)
  .map { _.map{_ - 'A' + 1}.sum }
  .zipWithIndex
  .map { case (v, idx) => (idx+1) * v }
  .sum
)

下一步,为了使其更加“功能化”,是将其分解为“功能”(偷偷摸摸的,是吧?)。理想情况下,每个函数都有一个清楚表达其用途的名称,并且该名称很短(目标是单个表达式,因此不需要大括号):

import io.Source

def unquote(s:String) = s.stripPrefix("\"").stripSuffix("\"")

def wordsFrom(fname:String) =
  Source.fromFile(fname).getLines.mkString.split(",").map(unquote)

def letterPos(c:Char) = c - 'A' + 1

println(
  wordsFrom("names.txt")
  .sortBy(identity)
  .map { _.map(letterPos).sum }
  .zipWithIndex
  .map { case (v, idx) => (idx+1) * v }
  .sum
)

wordsFrom是一个明显的单行代码,但我将其拆分以便在 stackOverflow 上更轻松地格式化

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数式 Scala 的重构/布局 的相关文章

随机推荐