【问题标题】:Scala: Suggestion for an idea for a hands on sessionScala:关于动手会议的想法的建议
【发布时间】:2011-01-03 10:45:27
【问题描述】:

我想提供一个 Scala 演示文稿,我想通过一个应用程序来实现它,并将其从使用 java 习惯用法的东西发展为使用 scala 强大功能的东西(特征、模式匹配、隐式转换、函数式编程)。

我对展示设计更改的东西特别感兴趣,而不是语法糖。最终的 scala 代码显然更易于维护和扩展。

所以有什么想法吗? (我不是要代码示例,只是要使用什么示例以及可以演示什么设计原则的粗略想法)。

【问题讨论】:

    标签: scala functional-programming


    【解决方案1】:

    一个很好的例子是为动态迷你语言开发一个小解释器

    基本的 java 实现需要经典的 interpreter design pattern,而函数式 scala 方法可以使用许多精彩的函数式习语,例如

    • 案例类
    • 模式匹配
    • 高阶函数

    或者甚至可能是monads,以便生成非常干净且易于理解的代码。

    比较一下

    class Number implements Expression {
        private int number;
        public Number(int number)       { this.number = number; }
        public int interpret(HashMap<String,Integer> variables)  { return number; }
    }
    

    case NumberLiteral(i) => Integer(i)
    

    请参阅scala page 上的解释器示例。

    【讨论】:

      【解决方案2】:

      为了帮助您在功能中进行选择并构建一些不错的代码示例,这里有一些想法:

      • 尝试坚持您的受众业务领域。尝试从他们的常用应用中举例(甚至是基础知识)。
      • 尝试猜测您的受众主要语言(java、perl、C++)并在您的示例中进行语法比较。
      • 看看:A tour of scalaScala snippets,然后选择要呈现的功能,你喜欢并且觉得舒服。
      • 尝试记住您使用 scala 的早期步骤以及您印象深刻(或困惑)的情况。

      【讨论】:

        【解决方案3】:

        我认为您在自己的范围内可能野心太大。仅仅向人们展示一种新的和不熟悉的语法可能会让他们“失去”一点点,所以添加更剧烈的变化可能有点过头了。不要忘记:如果第一个很受欢迎,您可以随时进行第二个演示!

        不久前,我在公司做过很多这样的事情;只是在进行演示时,我突然意识到某些 scala 语法对观众来说是多么奇怪和难以理解(或者这可能是我的演讲风格!)。我发现以下进展顺利:

        1. 迭代方法 - 采用单个 Java 方法(不是整个程序),然后转换为非常愚蠢的类似 Scala(类型声明和所有)。现在应用一组scala替换(例如类型推断),然后是另一个(例如类型别名),然后是另一个(例如闭包)等。最终结果可能是Java代码的三分之一,更具可读性和简洁,可以对比,因为人们现在熟悉正在发生的事情。与 scala 之类的东西相比,Java 在多大程度上只是一堆杂乱无章的类型和关键字,真是令人惊讶。

        2. 花一点时间来解释所有的旁白 - 例如,详细了解模式匹配及其工作原理。不要浏览提取器或case x :: xs。我发现人们对此真的很感兴趣,它有什么了不起的!

        3. 函数式编程风格需要一段时间才能深入了解。让人们立即开始理解这些东西是不合理的。我已经在 Scala 中编程一年多了,但我仍然对其中的一些感到困惑。

        4. 使用 REPL 对于一些低级的事情真的很酷,比如显示 scala 中的所有内容(包括同步、try-catch 等)是如何使用类型的表达式。

        当您证明了较低级别的东西令人敬畏时,希望您会激起人们对更多东西的兴趣。 (上周我正在和一位熟悉 scala 的同事一起查看三元运算符的实现,他发现这有点令人困惑。试图向一群新手介绍整个应用程序太过分了!)

        【讨论】:

        • +1 一些代码可能需要几个小时:@annotation.tailrec def x(s : String)(r : Int) : String = if(r > 0) x(s + r)( r - 1) 其他 s; val f = x("s") _; f(3)
        【解决方案4】:

        spelling corrector 示例用于在 Stackoverflow Devdays 中解释 Python。 short scala implementation 可能是一个开始:

        import util.matching.Regex.MatchIterator
        
        val alphabet = 'a' to 'z' toArray
        def train(features : MatchIterator) = (Map[String, Int]() /: features)((m, f) => m + ((f, m.getOrElse(f, 0) + 1)))
        def words(text : String) = ("[%s]+" format alphabet.mkString).r.findAllIn(text.toLowerCase)
        val dict = train(words(io.Source.fromFile("big.txt").mkString))
        
        def edits(s : Seq[(String, String)]) = (for((a,b) <- s; if b.length > 0) yield a + b.substring(1)) ++
          (for((a,b) <- s; if b.length > 1) yield a + b(1) + b(0) + b.substring(2)) ++
          (for((a,b) <- s; c <- alphabet if b.length > 0) yield a + c + b.substring(1)) ++
          (for((a,b) <- s; c <- alphabet) yield a + c + b)
        
        def edits1(word : String) = edits(for(i <- 0 to word.length) yield (word take i, word drop i))
        def edits2(word : String) = for(e1 <- edits1(word); e2 <-edits1(e1)) yield e2
        def known(words : Seq[String]) = for(w <- words; found <- dict.get(w)) yield w
        def or[T](candidates : Seq[T], other : => Seq[T]) = if(candidates.isEmpty) other else candidates
        
        def candidates(word: String) = or(known(List(word)), or(known(edits1(word)), known(edits2(word))))
        
        def correct(word : String) = ((-1, word) /: candidates(word))(
          (max, word) => if(dict(word) > max._1) (dict(word), word) else max)._2
        
        List("osters", "musters", "mixters") map correct foreach println 
        

        它演示了高阶函数、元组支持、正则表达式支持、按名称调用、表达式。 OO 特性(类型系统、特征、对象、包和可见性)缺失。 (我的目标是一个简短的实现。)但是您可以通过这些来实现 OO 实现。例如,您可以添加一些特征,如 Dictionary、Corrector 等。

        【讨论】:

        • 谢谢,但这是我想避免的例子。我担心的是大多数人会将其视为压缩代码的语法糖,仅此而已。以我的经验,这对开发人员来说是一个关闭,因为他们认为 tihs 类似于 zip:代码更小,但它需要在读者中进行某种“解压缩”才能理解它(例如,他们更喜欢有意义的 'addListener '到神秘的'
        • 所以我正在寻找一个例子,其中 java 以多种类型和刚性/脆弱结构开始,而 scala 版本的类型更少,结构更动态。我认为可堆叠特征模式是一个起点。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-22
        • 1970-01-01
        • 2018-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多